MSBuild脚本和VS2010发布应用Web.config转换


71

因此,我已经安装了VS 2010,并且正在为TeamCity构建集成修改MSBuild脚本。除了一个例外,一切都运转良好。

我如何告诉MSBuild我要应用发布发布时创建的Web.conifg转换文件...

我有以下代码生成已编译的网站,但它将Web.config,Web.Debug.config和Web.Release.config文件(共3个)输出到已编译的输出目录。在studio中,当我执行发布到文件系统时,它将进行转换并仅输出具有适当更改的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目标的时间。
kenchilada 2012年

Answers:


63

我一直在寻找类似的信息,但并未完全找到,因此我在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>

我已经测试了上述内容,并且可以确认它是否有效。您可能需要稍微调整一下结构以更好地适应您的构建脚本。


4
这与我最终得到的解决方案非常相似。唯一需要注意的是,TransformXml操作当前存在一个错误,该错误无法关闭源文件,因此您无法摆脱该源文件。只是要考虑的事情;就我而言,完成转换后,我想从部署目录中同时删除Debug.config和Release.config文件。要解决此问题,直到MS解决了该问题。您可以简单地将源文件和转换文件复制到临时目录,然后将新转换的文件复制回去,那么您应该能够删除/删除文件...
xspydr 2010年

1
是的,我在尝试时也遇到了该错误。这就是为什么我必须使用$(ProjectPath)和$(DeployPath)的原因。实际上,我建议使用一个中间位置来收集所有构建工件(其中将包括Web.config文件),然后从包含所有工件的位置将该位置部署到各种Web服务器。假设所有Web服务器将使用完全相同的Web.config文件,则可以避免多次转换Web.config。
Umar Farooq Khawaja 2010年


非常适合我,很棒的发现!所引用程序集的完整路径在此处(在x64上)“ C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.Tasks.Dll”。
stephen,

1
@Jason所谈论的错误现在已解决,我正在将v12.0用于msbuild.exe,它的工作原理很像魅力
Sarvesh 2015年

14

您应该能够通过使用Package目标并指定temp目录来完成此操作。

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/


1
唯一的问题是这种方法不会将config转换应用于连接字符串。
Troy Hunt,

所有的web.config转换都应该使用此方法。为什么连接字符串特别不起作用?
pattersonc

3
因为连接字符串的处理方式不同,所以您将看到一个可替换的令牌:troy.hn/gYb7M5除非您重写<AutoParameterizationWebConfigConnectionStrings>:troy.hn/mk8iJL
Troy Hunt,

gh,这将它放在我的bin文件夹下许多层次的非常随机的目录中
jjxtra 2012年

2
就像特洛伊(Troy)上面建议的那样,我只是将/ p:AutoParameterizationWebConfigConnectionStrings = False添加到我的msbuild命令中,并且该程序包现在包含最终的web.config转换。
Ben Cull 2012年


5

以下更改对我有用

<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目标将无法正常工作。这解决了我的问题。
SouthShoreAK 2014年


0

在寻找解决此问题的几天之后,我对该主题的另一个答案是:

您的发布配置文件和配置名称应该匹配。

就我而言,我没有。通过发布配置文件手动发布给我想要的结果,因为我的配置是在发布配置文件中设置的。但是,MSBuild会尝试变得智能,并根据名称神奇地连接发布配置文件和配置。(在命令中添加/ p:Configuration导致有关引用项目的输出路径的其他奇怪错误)。

我的意思很清楚:

命令行中的MSBuild语句

msbuild myproject.csproj -t:清理-t:Rebuild / p:DeployOnBuild = true / p:PublishProfile =“ Development”

作品

  • 发布配置文件名称:开发
  • 解决方案配置名称:开发

不起作用

  • 发布配置文件名称:开发
  • 解决方案配置名称:Dev

希望这可以帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.