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

本文关键字:提取 分支 MSBuild 构建 | 更新日期: 2023-09-27 18:15:11

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

我做了大量的研究,但还没有真正找到解决这个问题的方法。

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

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

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

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

我的建议是不要依赖您在$SolutionDirectory上的路径,因为不能保证值将在那里,您可以在任何目录中签出代码并打破规则。

我想所有这些都是为了构建自动化,对吗?不管你使用的自动化工具是什么,关于MSBuild属性有一些重要的事情要记住:

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

记住这一点,下面是你需要做的:

  1. 定义一个"分支";属性在脚本中使用默认值(例如,develop, master)。允许从命令行/环境变量覆盖它。

    <PropertyGroup>
        <Branch Condition="'$(Branch)'==''">develop</Branch>
    </PropertyGroup>
    
  2. 从您的构建系统(持续集成服务器)发送适当的值,它可以作为环境变量或命令行属性。无论您使用哪种工具,它们都支持此功能。TFS, TeamCity, CruiseControl。其中一些将基于源代码控制设置预先定义这个,在其他情况下,您将需要手动执行此操作。您可以查看现有的构建日志,看看是否已经为分支设置了属性,或者检查您是否正确设置了该属性。

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

出于开发目的,在Visual Studio中右键单击您的项目>性能比;调试,在"命令行参数"字段add: /p:Branch=yourbranchname当你从VS运行构建时,它将使用这里定义的值

也许MsBuild扩展包是为你?有任务MSBuild.ExtensionPack.Xml.XmlFile和Action UpdateAttribute (http://www.msbuildextensionpack.com/help/3.5.11.0/html/4009fe8c-73c1-154f-ee8c-e9fda7f5fd96.htm)来改变现有的属性值。您必须定义文件、xpath和值才能做到这一点。但是我不确定这些例外是否适用于新版本的。net框架。

感谢大家的帮助。虽然答案并没有让我得到我想要的,但它把我推向了满足我需求的正确方向。以下是我最终采用的解决方案:

<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属性并稍后处理。

希望这对其他人有所帮助!