【发布时间】:2013-04-02 17:38:29
【问题描述】:
我有以下设置: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 文件 (x86)\MSBuild\Microsoft\VisualStudio\v10.5\Web\Microsoft.Web.Publishing.targets(1399,5): 错误:将文件 Web.config 复制到 obj\Site1-Stage\TransformWebConfig\original\Web.config 失败。可以 找不到文件“Web.config”。 [我的解决方案\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目标输出。 -
也许使用“BeforeBuild”?顺便说一句,您在 csproj 中包含 web.config 吗?我相信大多数发布活动都依赖于项目中的项目而不是文件夹中的项目 - 尽管没有检查它。如果没有 - 您可以在项目中包含 web.config,同时仍将其从源代码管理中排除
-
@Lanorkin - 成功了!非常感谢 - 请发表您的评论作为答案。
-
这两个是哪一个?
标签: msbuild web-config web-config-transform