我有以下设置: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。
我遇到了以下错误:
为了管理这些配置,我使用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
我遇到了以下错误:
我尝试在 MSBuild 命令行中明确添加"AfterBuild"目标:"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 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