MSBuild Script 和 VS2010 发布应用 Web.config 转换
Posted
技术标签:
【中文标题】MSBuild Script 和 VS2010 发布应用 Web.config 转换【英文标题】:MSBuild Script and VS2010 publish apply Web.config Transform 【发布时间】:2022-02-19 11:26:51 【问题描述】:所以,我已经安装了 VS 2010,并且正在修改我的 MSBuild 脚本以用于我们的 TeamCity 构建集成。一切都很好,只有一个例外。
如何告诉 MSBuild 我想应用我在发布构建时创建的 Web.conifg 转换文件...
我有以下生成已编译网站的内容,但是它将 Web.config、Web.Debug.config 和 Web.Release.config 文件(全部 3 个)输出到已编译的输出目录。在工作室中,当我执行发布到文件系统时,它会进行转换并仅输出具有适当更改的 Web.config...
<Target Name="CompileWeb">
<MSBuild Projects="myproj.csproj" Properties="Configuration=Release;" />
</Target>
<Target Name="PublishWeb" DependsOnTargets="CompileWeb">
<MSBuild Projects="myproj.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputFolder)$(WebOutputFolder);
OutDir=$(TempOutputFolder)$(WebOutputFolder)\;Configuration=Release;" />
</Target>
任何帮助都会很棒..!
我知道这可以通过其他方式完成,但如果可能的话,我想使用新的 VS 2010 方式来完成此操作
【问题讨论】:
这是一篇关于自定义转换的优秀文章:diaryofaninja.com/blog/2011/09/14/… 由于大量的经典 ASP 和我们必须适应的其他问题,我们需要比平常更多地自定义 Web 部署。本文节省了挖掘 MS 目标的时间。 【参考方案1】:我一直在寻找类似的信息,但没有找到,所以我在 Visual Studio 2010 和 MSBuild 4.0 附带的 .targets 文件中进行了一些挖掘。我认为这是寻找执行转换的 MSBuild 任务的最佳位置。
据我所知,使用了以下 MSBuild 任务:
<Project ToolsVersion="4.0"
DefaultTargets="Deploy"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="TransformXml"
AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
<PropertyGroup>
<ProjectPath>C:\Path to Project\Here</ProjectPath>
<DeployPath>C:\Path to Deploy\There</DeployPath>
<TransformInputFile>$(ProjectPath)\Web.config</TransformInputFile>
<TransformFile>$(ProjectPath)\Web.$(Configuration).config</TransformFile>
<TransformOutputFile>$(DeployPath)\Web.config</TransformOutputFile>
<StackTraceEnabled>False</StackTraceEnabled>
</PropertyGroup>
<Target Name="Transform">
<TransformXml Source="$(TransformInputFile)"
Transform="$(TransformFile)"
Destination="$(TransformOutputFile)"
Condition="some condition here"
StackTrace="$(StackTraceEnabled)" />
</Target>
</Project>
我已经测试了上述内容并且可以确认它有效。您可能需要稍微调整结构以更好地适应您的构建脚本。
【讨论】:
这与我最终得到的解决方案非常相似。唯一需要注意的是,TransformXml 操作当前有一个错误,它不会关闭源文件,因此您无法摆脱源文件。只是需要考虑的事情;就我而言,在我进行转换后,我想从部署目录中删除 Debug.config 和 Release.config 文件。在 MS 解决问题之前解决这个问题。您可以简单地将源文件和转换文件复制到临时目录,然后将新转换的文件复制回来,然后您应该能够删除/删除文件... 是的,我在尝试时也遇到了这个错误。这就是我必须使用 $(ProjectPath) 和 $(DeployPath) 的原因。实际上,我建议使用中间位置来收集所有构建工件(包括 Web.config 文件),然后从包含所有工件的该位置部署到各种 Web 服务器。假设所有 Web 服务器都将采用完全相同的 Web.config 文件,这将避免多次转换 Web.config。 +1 从***.com/questions/2992778/…解决我的问题 非常适合我,很棒的发现!引用程序集的完整路径在此处(在 x64 上)“C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.Dll”。 @Jason 所说的错误现已解决,我正在为 msbuild.exe 使用 v12.0,它就像一个魅力【参考方案2】:您应该能够通过使用 Package 目标并指定临时目录来完成此操作。
msbuild solution.sln /p:Configuration=Release;DeployOnBuild=true;DeployTarget=Package;_PackageTempDir=..\publish
http://pattersonc.com/blog/index.php/2010/07/15/visual-studio-2010-publish-command-from-msbuild-command-line/
【讨论】:
唯一的问题是这种方法不会将配置转换应用于连接字符串。 所有 web.config 转换都应该使用这种方法工作。为什么连接字符串特别不起作用? 因为连接字符串的处理方式不同,您会看到一个可替换的令牌:troy.hn/gYb7M5 除非您覆盖 :troy.hn/mk8iJL 呃,这把它放在我的 bin 文件夹下面很多层的某个非常随机的目录中 就像 Troy 上面建议的那样,我只是将 /p:AutoParameterizationWebConfigConnectionStrings=False 添加到我的 msbuild 命令中,并且包现在包含最终的 web.config 转换。【参考方案3】:或者,您可以尝试使用 XDT 转换工具:
http://ctt.codeplex.com
我正在使用它而不是弄乱晦涩的 msbuild 目标。适用于 app.config 而不仅仅是 web.config。
【讨论】:
【参考方案4】:以下更改对我有用
<MSBuild Projects="$(ProjectFile)"
Targets="ResolveReferences;_WPPCopyWebApplication"
Properties="WebProjectOutputDir=TempOutputFolder;OutDir=$(WebProjectOutputDir);Configuration=$(Configuration);" />
来自 MsBuild 文件夹下的 Microsoft.WebApplication.targets 文件
_CopyWebApplication
This target will copy the build outputs along with the
content files into a _PublishedWebsites folder.
This Task is only necessary when $(OutDir) has been redirected
to a folder other than ~\bin such as is the case with Team Build.
The original _CopyWebApplication is now a Legacy, you can still use it by
setting $(UseWPP_CopyWebApplication) to true.
By default, it now change to use _WPPCopyWebApplication target in
Microsoft.Web.Publish.targets.
It allow to leverage the web.config trsnaformation.
【讨论】:
我正在使用 nant,并且在我还添加了目标 _WPPCopyWebApplication 之前,TransformWebConfig 目标对我不起作用。这解决了我的问题。【参考方案5】:我不是 MSBuild 方面的专家,但我能够使用此链接中的信息来完成相同的任务:
http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx
在文章底部附近有一个与 MSBuild 相关的部分。希望这会有所帮助。
【讨论】:
【参考方案6】:在我解决这个问题之前已经搜索了几天之后,这个主题的另一个答案:
您的发布配置文件和配置名称应该匹配。
在我的情况下,我没有。通过发布配置文件手动发布给了我想要的结果,因为我的配置是在发布配置文件中设置的。然而,MSBuild 试图变得智能,并根据名称神奇地连接发布配置文件和配置。 (在命令中添加 /p:Configuration 会导致有关引用项目的输出路径的其他奇怪错误)。
只是为了明确我的意思:
命令行中的 MSBuild 语句
msbuild myproject.csproj -t:Clean -t:Rebuild /p:DeployOnBuild=true /p:PublishProfile="Development"
有效
发布个人资料名称:开发 解决方案配置名称:开发不工作
发布个人资料名称:开发 解决方案配置名称:Dev希望这会有所帮助!
【讨论】:
以上是关于MSBuild Script 和 VS2010 发布应用 Web.config 转换的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 MSBuild 构建具有 VS2010 配置的 VS2015 解决方案?