在 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 属性命名约定的环境变量都将被解释为 属性。
考虑到这一点,这就是您需要做的:
在您的脚本中使用默认值(即 develop、master)定义 "Branch" 属性。允许它被命令line/environment变量覆盖。
<PropertyGroup>
<Branch Condition="'$(Branch)'==''">develop</Branch>
</PropertyGroup>
从您的构建系统(持续集成服务器)发送适当的值,它可以作为环境变量或命令行 属性。不管你用什么工具,都支持这个。 (TFS、TeamCity、CruiseControl.Net 等)其中一些将根据源代码管理设置进行预定义,在其他情况下,您需要手动进行。您可以查看现有的构建日志,看看是否已经为分支设置了 属性,或者检查您是否正确设置了 属性。
根据需要使用预构建事件中的值。
出于开发目的,在 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 属性 并稍后处理。
希望这对其他人有帮助!
我的最终目标是在 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 属性命名约定的环境变量都将被解释为 属性。
考虑到这一点,这就是您需要做的:
在您的脚本中使用默认值(即 develop、master)定义 "Branch" 属性。允许它被命令line/environment变量覆盖。
<PropertyGroup> <Branch Condition="'$(Branch)'==''">develop</Branch> </PropertyGroup>
从您的构建系统(持续集成服务器)发送适当的值,它可以作为环境变量或命令行 属性。不管你用什么工具,都支持这个。 (TFS、TeamCity、CruiseControl.Net 等)其中一些将根据源代码管理设置进行预定义,在其他情况下,您需要手动进行。您可以查看现有的构建日志,看看是否已经为分支设置了 属性,或者检查您是否正确设置了 属性。
根据需要使用预构建事件中的值。
出于开发目的,在 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 属性 并稍后处理。
希望这对其他人有帮助!