我的最终目标是在MSBuild预构建事件中提取分支名称(它是$ SolutionDirectory的一部分),然后将其注入我的app.config appSettings。
我一直在进行大量的挖掘工作,而且还没有真正找到解决这个问题的方法。
我希望能够在预构建期间做这样的事情:
<XmlPoke XmlInputPath="App.config"
Query="/configuration/appSettings/add[@key='BuildBranch']/@value"
Value="$(Branch)" />
以前有人做过这样的事吗?
答案 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的重要事项:
考虑到这一点,这就是你需要做的事情:
使用默认值(即develop,master)在脚本中定义“Branch”属性。允许它从命令行/环境变量中覆盖。
<PropertyGroup>
<Branch Condition="'$(Branch)'==''">develop</Branch>
</PropertyGroup>
从构建系统(Continuous Integration Server)发送适当的值,它可以作为环境变量或命令行属性。使用哪种工具并不重要,所有这些工具都支持这一点。 (TFS,TeamCity,CruiseControl.Net等)其中一些将基于源控制设置预定义,在其他情况下,您需要手动执行此操作。您可以查看现有的构建日志,以查看是否已为分支设置了属性,或检查是否正确设置了属性。
根据需要使用预构建事件中的值。
出于开发目的,在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属性并稍后处理。
希望这有助于其他人!