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

Extract branch name in MSBuild prebuild step

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

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

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

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

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

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

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

我假设所有这些都是为了构建自动化,对吗?除了您用于自动化的工具之外,还有一些关于 MSBuild Properties:

的重要事项需要记住
  • 可以在 MSBuild 脚本中定义属性
  • 可以从命令行覆盖属性(这可以通过脚本进行限制)。
  • 任何遵循 MSBuild 属性命名约定的环境变量都将被解释为 属性。

考虑到这一点,这就是您需要做的:

  1. 在您的脚本中使用默认值(即 develop、master)定义 "Branch" 属性。允许它被命令line/environment变量覆盖。

    <PropertyGroup>
        <Branch Condition="'$(Branch)'==''">develop</Branch>
    </PropertyGroup>
    
  2. 从您的构建系统(持续集成服务器)发送适当的值,它可以作为环境变量或命令行 属性。不管你用什么工具,都支持这个。 (TFS、TeamCity、CruiseControl.Net 等)其中一些将根据源代码管理设置进行预定义,在其他情况下,您需要手动进行。您可以查看现有的构建日志,看看是否已经为分支设置了 属性,或者检查您是否正确设置了 属性。

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

出于开发目的,在 Visual Studio 中右键单击您的项目 > 属性 > 调试,在 "Command line arguments" 字段中添加:/p:Build=yourbranchname当您 运行 从 VS 构建时,它将使用此处定义的值。

只想感谢大家的帮助。虽然答案并没有完全满足我的需求,但它把我推向了满足我需求的正确方向。这是我最终采用的解决方案:

<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) build 属性 将所有二进制文件转储到。获得这些知识后,我能够为我们的需求创建上述解决方案。这最终创建了一个相当一致的字符串,我可以将其附加到我的 BuildInfo 属性 并稍后处理。

希望这对其他人有帮助!