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>

关于如何让它将网络文件直接发送到特定位置的任何想法?

4

3 回答 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 在本地发布

于 2010-08-09T04:06:30.370 回答
2

如果您使用的是 VS2010 Web 应用程序(而不是网站项目),请考虑在您的项目中设置 Package/Publish 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 文件部署:

用于部署 Web 应用程序的示例包设置

还有一个额外的怪癖。如果您在目标计算机上安装 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 (
于 2011-04-13T17:24:37.260 回答
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 - 将输出所有内容的本地文件夹。您的复制脚本也将使用它作为源目录。

解决方案配置- 发布、调试

于 2010-06-30T18:43:37.363 回答