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的博客上找到.
我终于设法让这个工作.我正在使用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复制到您需要的任何位置.
默认情况下,对于命令行和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中的网站构建项目.
Run Code Online (Sandbox Code Playgroud)<Target Name="AfterBuild"> <TransformXml Condition="Exists('$(OutDir)\_PublishedWebsites\$(TargetName)')" Source="Web.config" Transform="$(ProjectConfigTransformFileName)" Destination="$(OutDir)\_PublishedWebsites\$(TargetName)\Web.config" /> </Target>要保持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.然后完成后再右键单击并选择"重新加载项目".
您需要做的就是设置应在 TFS 构建定义中使用哪些配置。
就我而言,我专门为 CI 设置了一个配置,然后执行正确的 web.config 转换。确保您已添加“CI”转换文件,然后就可以开始了。
| 归档时间: |
|
| 查看次数: |
8807 次 |
| 最近记录: |