MSBuild 2010 - 如何将Web应用程序发布到特定位置(nant)?

18

我正在尝试让MSBuild 2010将Web应用程序发布到特定位置。我可以让它将部署包发布到特定路径,但部署包会添加自己的路径并更改路径。

例如:如果我告诉它发布到 C:\dev\build\Output\Debug ,则实际的 Web 文件最终会出现在 C:\dev\build\Output\Debug\Archive\Content\C_C\code\app\Source\ControllersViews\obj\Debug\Package\PackageTmp。而路径中的 C_C 部分会更改(不确定如何选择路径的这一部分)。

这意味着我不能只脚本化从发布位置复制文件。

目前我正在使用此 nant/msbuild 命令:

  <target name="compile" description="Compiles">
<msbuild project="${name}.sln">

  <property name="Platform" value="Any CPU"/>
  <property name="Configuration" value="Debug"/>
  <property name="DeployOnBuild" value="true"/>
  <property name="DeployTarget" value="Package"/>
  <property name="PackageLocation" value="C:\dev\build\Output\Debug\"/>
  <property name="AutoParameterizationWebConfigConnectionStrings" value="false"/>
  <property name="PackageAsSingleFile" value="false"/>

</msbuild>

有没有关于如何将网页文件直接发送到特定位置的想法?

3个回答

36
msbuild /t:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Release;_PackageTempDir=C:\temp\somelocation;AutoParameterizationWebConfigConnectionStrings=false MyProject.csproj

相应的NAnt脚本:

<msbuild project="MyProject.csproj" target="PipelinePreDeployCopyAllFilesToOneFolder">
  <property name="Configuration" value="Release" />
  <property name="_PackageTempDir" value="C:\temp\somelocation" />
  <property name="AutoParameterizationWebConfigConnectionStrings" value="false" />
</msbuild>

参考资料

另请参阅Team Build:使用MSDeploy本地发布


2
如果您使用的是VS2010 Web应用程序(而不是Web站点项目),请考虑在项目中设置包/发布Web设置,并在nant脚本中构建“Project”目标。
这里有很多关于msdeploy的信息:http://www.hanselman.com/blog/WebDeploymentMadeAwesomeIfYoureUsingXCopyYoureDoingItWrong.aspx 在我的nant脚本中,我运行以下msbuild命令:
    <if  test="${property::exists('basename')}">
        <exec program="${msbuild.location}" workingdir="${project::get-base-directory()}">
            <arg value="/p:Configuration=${configuration}" />
            <arg value="/logger:ThoughtWorks.CruiseControl.MsBuild.XmlLogger,${msbuild.logger.dll}" if="${nunit.formatter.type == 'Xml'}"/>
            <arg value="/noconsolelogger" if="${nunit.formatter.type == 'Xml'}"/>
            <arg value="${basename}.sln"/>
        </exec>
    </if>

...

    <if  test="${property::exists('basename')}">
        <exec program="${msbuild.location}" workingdir="${project::get-base-directory()}\${basename}">
            <arg value="/p:Configuration=${configuration}" />
            <arg value="/t:Package" />
            <arg value="/logger:ThoughtWorks.CruiseControl.MsBuild.XmlLogger,${msbuild.logger.dll}" if="${nunit.formatter.type == 'Xml'}"/>
            <arg value="/noconsolelogger" if="${nunit.formatter.type == 'Xml'}"/>
            <arg value="${basename}.csproj"/>
        </exec>
    </if>

我的basename nant变量给出了Web应用程序的VS解决方案文件(.sln)和项目文件(.csproj)的名称。我偏好在项目设置中显示的zip文件部署。

Sample Package Settings for Deployment of Web Application

有一个额外的怪癖。如果您在目标计算机上安装了MSDeploy 2.0版本,则必须编辑.deploy.cmd文件以更改MSDeploy版本号,如下所示:
更改
  for /F "usebackq tokens=2*" %%i  in (`reg query "HKLM\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\1" /v InstallPath`) do (

"到"
  for /F "usebackq tokens=2*" %%i  in (`reg query "HKLM\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\2" /v InstallPath`) do (

1

我认为您使用了错误的属性。请尝试使用OutDir属性。

<arg value="/property:OutDir=C:\dev\build\Output\Debug\" />

个人而言,我直接调用MsBuild.exe而不是使用msbuild标签:

    <exec program="${MSBuildPath}">
        <arg line='"${ProjectFile}"' />
        <arg value="/target:_CopyWebApplication" />
        <arg value="/property:OutDir=${LocalDeployPath}\" />
        <arg value="/property:WebProjectOutputDir=${LocalDeployPath}" />
        <arg value="/property:Configuration=${SolutionConfiguration}" />
        <arg value="/verbosity:normal" />
        <arg value="/nologo" />
    </exec>

MSBuildPath - MsBuild.exe 的路径(让您可以针对任何框架版本进行目标定位)

ProjectFile - 您的项目文件的相对路径

LocalDeployPath - 本地文件夹,所有东西都将被输出到这里。您的复制脚本也将使用此作为源目录。

SolutionConfiguration - 发布、调试


如果您使用Nuget引入参考库,则CopyWebApplication将无法正常工作。 - Russel Yang
是的,OutDir属性可以精确控制它,大致为“_PublishedWebsites$(ProjectName)"子目录。 - Chris F Carroll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接