在TFS 2010或msbuild中触发配置转换

gre*_*ade 16 .net msbuild tfs continuous-integration config

我试图在持续集成环境中使用配置转换.

我需要一种方法来告诉TFS构建代理执行转换.我有点希望它在发现配置转换文件(web.qa-release.config,web.production-release.config等等)后才能正常工作.但事实并非如此.

我有一个TFS构建定义,可以构建正确的配置(qa-release,production-release等等),我有一些特定的.proj文件可以在这些定义中构建,并且包含一些特定于环境的参数,例如:

<PropertyGroup Condition=" '$(Configuration)'=='production-release' ">
    <TargetHost Condition=" '$(TargetHost)'=='' ">qa.web</TargetHost>
    ...
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)'=='qa-release' ">
    <TargetHost Condition=" '$(TargetHost)'=='' ">production.web</TargetHost>
    ...
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

我从输出中知道正在构建正确的配置.现在我只需要学习如何触发配置转换.是否有一些hocus pocus,我可以添加到构建中的最终.proj以启动转换并吹走各个转换文件?

小智 11

我找到了另一种方法来实现这一目标,而不是创建自定义活动.您只需要修改正在构建的Web应用程序的visual studio项目文件.

添加以下内容(可以在项目文件末尾找到'AfterBuild'目标的占位符):

<Target Name="AfterBuild" Condition="$(IsAutoBuild)=='True'"> 
  <ItemGroup> 
         <DeleteAfterBuild Include="$(WebProjectOutputDir)\Web.*.config" /> 
  </ItemGroup> 
  <TransformXml Source="Web.config" Transform="$(ProjectConfigTransformFileName)" Destination="$(WebProjectOutputDir)\Web.config"/> 
  <Delete Files="@(DeleteAfterBuild)" />
</Target> 
Run Code Online (Sandbox Code Playgroud)

然后,您只需添加/p:IsAutoBuild="True"到构建定义的"高级"部分中的"MSBuild参数"字段.

当TFS执行构建时,这将强制TFS 2010在web.config上进行转换.

更多细节可以在Kevin Daly的博客上找到.


Roh*_*ngh 6

我终于设法让这个工作.我正在使用TFS 2008,但也使用MSBuild 4.0,所以它应该适合你.

首先,将此导入添加到TFSBuild.proj:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
Run Code Online (Sandbox Code Playgroud)

接下来,添加BeforeDropBuild目标:

<Target Name="BeforeDropBuild">
  <TransformXml Source="$(SolutionRoot)\MySite\Web.config"
    Transform="$(SolutionRoot)\MySite\Web.QA.config"
    Destination="$(OutDir)\_PublishedWebsites\MySite\Web.QA.config.transformed" />
</Target>
Run Code Online (Sandbox Code Playgroud)

然后,您可以将Web.QA.config.transformed复制到您需要的任何位置.

  • 实际上,向后兼容性内容是作为升级过程的一部分自动安装的.MS为这种情况留下了适当的位置. (3认同)

Sha*_*ser 6

默认情况下,对于命令行和TFS构建,已禁用添加到Visual Studio 2010中的网站项目的web.config转换功能.

有两个相对简单的解决方案:

选项1:编辑构建定义并将以下内容添加到"MSBuild Arguments"字段:

/p:UseWPP_CopyWebApplication=true /p:PipelineDependsOnBuild=false
Run Code Online (Sandbox Code Playgroud)

UseWPP_CopyWebApplication将导致为构建激活新的Web发布管道(WPP).WPP执行web.config转换,也可用于阻止诸如.PDB文件被复制到bin文件夹之类的内容.

选项2:MSBuild和WPP都是完全可扩展的.在与项目相同的目录中创建一个新的XML文件,并使用".targets"扩展名 - 例如,ProjectName.custom.targets.将以下MSBuild代码放入目标文件中:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <UseWPP_CopyWebApplication>True</UseWPP_CopyWebApplication>
    <PipelineDependsOnBuild>False</PipelineDependsOnBuild>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

右键单击您的网站,然后选择"卸载项目".右键单击卸载的项目,然后选择"编辑".滚动到项目文件的底部并查找以下行:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
Run Code Online (Sandbox Code Playgroud)

这些行是C#和Web Project构建过程连接起来的地方.在CSharp导入之前立即将导入插入到自定义构建扩展(目标文件):

<Import Project="ProjectName.custom.targets"/>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
Run Code Online (Sandbox Code Playgroud)

就是这样 - 你很高兴.MSBuild自定义方法需要设置更多工作,但好处是您可以使用新目标文件"挂钩"到构建过程中,并且可以更好地控制构建在服务器上的运行方式.例如,您可以挂钩任务来执行CSS和JS压缩.

我还建议查看"wpp targets" - 如果您使用特定名称"ProjectName.wpp.targets"命名另一个MSBuild文件,则可以控制整个网站发布过程.我们使用它来删除-vsdoc javascript文档文件,因为复制了已发布的网站输出:

<ItemGroup>
  <ExcludeFromPackageFiles Include="Scripts\**\*-vsdoc.js;Resources\Scripts\**\-vsdoc.js">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

一切都说,你可能最好完全从你的构建中删除生产web.configs.我们将转换直接放在我们的生产部署机器上,并在部署应用程序时使用powershell进行转换.


小智 5

这是一个更简单的答案.:)

http://social.msdn.microsoft.com/Forums/en-US/tfsbuild/thread/d5c6cc7b-fbb1-4299-a8af-ef602bad8898/

从链接(如果它被移动/ 404 /等):

这是我解决这个问题的方法.关键是编辑网站上的*.csproj文件并将以下内容添加到AfterBuild目标(确保将结束注释移到其上方).这是我们在Team Foundation Server中的网站构建项目.

<Target Name="AfterBuild">
    <TransformXml Condition="Exists('$(OutDir)\_PublishedWebsites\$(TargetName)')"
                  Source="Web.config"
                  Transform="$(ProjectConfigTransformFileName)"
                  Destination="$(OutDir)\_PublishedWebsites\$(TargetName)\Web.config" />
</Target>
Run Code Online (Sandbox Code Playgroud)

要保持web.debug.config,web.release.config等不被发布,请确保在每个配置转换文件的属性窗口中将"Build Action"设置为"None".只有主web.config应该有"内容"的"构建操作"

编辑csproj文件的一种简单方法是从Visual Studio库中加载Visual Studio 2010的"PowerCommands for Visual Studio 2010"或"Productivity Power Tools"扩展.加载完成后,您只需右键单击解决方案中的项目,然后选择"卸载项目".然后,您可以再次右键单击并选择"编辑..."直接编辑csproj文件XML.然后完成后再右键单击并选择"重新加载项目".


Wal*_*eza 1

您需要做的就是设置应在 TFS 构建定义中使用哪些配置。

  1. 转到团队资源管理器 > 构建
  2. 编辑您的构建定义(或创建新的)
  3. 在“处理”步骤下有一个“要构建的配置”的设置。

就我而言,我专门为 CI 设置了一个配置,然后执行正确的 web.config 转换。确保您已添加“CI”转换文件,然后就可以开始了。

  • 我有一个发布配置 (AnyCpu|Release),但构建中的 Web.config 没有更改。 (4认同)