MSBuild - 如何在进行部署时强制执行"AfterBuild"目标?

6
我有以下设置:ASP.Net MVC .Net 4.0解决方案,其中包含5个项目和多个解决方案配置(Site1-Stage,Site1-Live,Site2-Stage等)。这样做的原因很简单-我们将相同的代码库部署到具有不同配置设置的多个服务器上。
为了管理这些配置,我使用Troy Hunt在他的文章You're deploying it wrong! TeamCity, Subversion & Web Deploy part 1: Config transforms中描述的方法。简而言之-我没有在我的SVN存储库中使用web.config,而是使用Web.Base.Config、Web.Site1-Stage.Config等以及AfterBuild目标中的XmlTransformation任务。在构建过程中,根据所选的配置生成所需的web.config。
 <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="AfterBuild">
    <TransformXml Source="Web.Base.config" Transform="Web.$(Configuration).config" Destination="Web.config" StackTrace="true" />
  </Target>

问题来了:当我像这样执行MSBuild时:

msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild

一切顺利,Site1-Stage配置的web.config已经正确生成。然而,如果我运行这个命令:

msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild /P:DeployOnBuild=True

我遇到了以下错误:

"MySolution.sln"(重新生成目标)(1) -> "MySolution\MyWebProj.csproj" (重新生成目标)(3) ->(PreTransformWebConfig 目标) -> C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.5\Web\Microsoft.Web.Publishing.targets(1399,5): 错误:复制文件 Web.config 到 obj\Site1-Stage\TransformWebConfig\original\Web.config 失败。找不到文件 'Web.config'。[MySolution\MyWebProj.csproj]

我尝试在 MSBuild 命令行中明确添加"AfterBuild"目标:
msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild,AfterBuild /P:DeployOnBuild=True

但结果仍然出现了相同的错误。

为什么我需要这个:这只是一个非常独立的例子,实际上我正在尝试从TeamCity CI服务器设置自动发布。我认为如果我在当前发布步骤之前添加“Visual Studio(sln)”运行程序的新构建步骤,那么它会起作用,它将首先重新构建项目(并生成web.config)- 然后再发布。但是,我有很多发布步骤(现在大约有20个),我想避免这种情况。我的理解是,“发布”过程会作为其一部分进行构建,因此我想“重用”它。

问题是:我应该如何修改我的MSBuild命令行以强制发生配置转换?

谢谢。


你的 AfterBuild 目标没有任何输出。看起来 MSBuild 跳过了这个目标,认为它是最新的。将输出(在你的情况下是 Web.Config)添加到你的 AfterBuild 目标输出中。 - vharavy
1
也许可以使用“BeforeBuild”?顺便问一下,你的csproj中是否包含web.config?我相信大多数发布活动都依赖于项目中的项,而不是文件夹中的项——尽管我没有检查过。如果没有-您可以将web.config包含在项目中,同时仍然将其从源代码控制中排除。 - Lanorkin
@Lanorkin - 那个有效了!非常感谢 - 请将您的评论发布为答案。 - avs099
这两个中的哪一个? - Lanorkin
1个回答

4
也许可以使用“BeforeBuild”?顺便问一下,您的csproj文件中是否包含了web.config文件?我相信大多数发布操作都依赖于项目中的项而不是文件夹中的项。您可以将web.config文件包含在项目中,同时将其从源代码控制中排除。

@avs099,你需要将web.config包含在项目中还是源代码控制中?(即使它会被转换覆盖...) - Mobigital
不包括@Mobigital - avs099

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