我正在尝试让MSBuild 2010将Web应用程序发布到特定位置。 我可以将部署包发布到特定路径,但部署包然后添加自己的路径更改。
例如:如果我告诉它发布到C:\dev\build\Output\Debug
,那么实际的网络文件会以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>
有关如何将网络文件直接发送到特定位置的任何想法吗?
答案 0 :(得分: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>
答案 1 :(得分:2)
如果您使用的是VS2010 Web应用程序(而不是网站项目),请考虑在项目中设置打包/发布Web设置,并在您的nant脚本中构建“项目”目标。
很多有用的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文件部署:
还有一个额外的怪癖。如果在目标计算机上安装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 (
答案 2 :(得分: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 - 将输出everthing的本地文件夹。您的副本脚本也将使用它作为源目录。
SolutionConfiguration - 发布,调试