在MSBuild预构建步骤中提取分支名称

时间:2016-10-26 19:04:05

标签: c# tfs msbuild build-automation

我的最终目标是在MSBuild预构建事件中提取分支名称(它是$ SolutionDirectory的一部分),然后将其注入我的app.config appSettings。

我一直在进行大量的挖掘工作,而且还没有真正找到解决这个问题的方法。

我希望能够在预构建期间做这样的事情:

<XmlPoke XmlInputPath="App.config" 
  Query="/configuration/appSettings/add[@key='BuildBranch']/@value" 
  Value="$(Branch)" />

以前有人做过这样的事吗?

3 个答案:

答案 0 :(得分:0)

也许MsBuild Extension Pack适合你?有任务MSBuild.ExtensionPack.Xml.XmlFile和Action UpdateAttribute(http://www.msbuildextensionpack.com/help/3.5.11.0/html/4009fe8c-73c1-154f-ee8c-e9fda7f5fd96.htm)来更改现有属性值。您必须定义文件,xpath和值才能执行此操作。但我不确定这种异常是否适用于新版本的.net框架。

答案 1 :(得分:0)

我的建议是不要依赖你在$ SolutionDirectory上的路径,因为不能保证该值存在,你可以在任何目录中检查你的代码并破坏规则。

我认为所有这些都适用于构建自动化吗?除了用于自动化的工具之外,还需要记住一些关于MSBuild Properties的重要事项:

  • 可以在MSBuild脚本中定义属性
  • 可以从命令行覆盖属性(可以从脚本中限制)。
  • 遵循MSBuild属性命名约定的任何环境变量都将被解释为属性。

考虑到这一点,这就是你需要做的事情:

  1. 使用默认值(即develop,master)在脚本中定义“Branch”属性。允许它从命令行/环境变量中覆盖。

    <PropertyGroup>
        <Branch Condition="'$(Branch)'==''">develop</Branch>
    </PropertyGroup>
    
  2. 从构建系统(Continuous Integration Server)发送适当的值,它可以作为环境变量或命令行属性。使用哪种工具并不重要,所有这些工具都支持这一点。 (TFS,TeamCity,CruiseControl.Net等)其中一些将基于源控制设置预定义,在其他情况下,您需要手动执行此操作。您可以查看现有的构建日志,以查看是否已为分支设置了属性,或检查是否正确设置了属性。

  3. 根据需要使用预构建事件中的值。

  4. 出于开发目的,在Visual Studio中右键单击您的项目&gt;属性&gt;调试,在“命令行参数”字段中添加: / p:Build = yourbranchname ,当您从VS运行构建时,它将使用此处定义的值。

答案 2 :(得分:0)

只想感谢大家的帮助。虽然答案并没有让我得到我想要的东西,但它促使我朝着正确的方向发展我的需求。以下是我最终选择的解决方案:

<Target Name="AfterBuild">
  <XmlPoke Condition=" '$(TeamBuildOutDir)' == '' " XmlInputPath="$(ProjectDir)bin\$(ConfigurationName)\$(TargetName).dll.config" Query="/configuration/appSettings/add[@key='BuildInfo']/@value" Value="$(SolutionDir)" />
  <XmlPoke Condition=" '$(TeamBuildOutDir)' != '' " XmlInputPath="$(TeamBuildOutDir)\$(SolutionName)\$(ProjectName)\$(TargetName).dll.config" Query="/configuration/appSettings/add[@key='BuildInfo']/@value" Value="$(SolutionDir)" />
</Target>

事实证明,我们实际上在构建机器上做了一些时髦的东西,它们构建目录的方式与本地方式大不相同。我们使用$(TeamBuildOutDir)构建属性将所有二进制文件转储到。获得该知识后,我能够根据我们的需求创建上述解决方案。这最终会创建一个相当一致的字符串,我可以将其附加到我的BuildInfo属性并稍后处理。

希望这有助于其他人!