2016-10-26 5 views
1

私の最終的な目標は、MSBuildプリビルドイベントでブランチ名($ SolutionDirectoryの一部)を抽出し、それを私のapp.config appSettingsに注入することです。MSBuildプレビルドステップでブランチ名を抽出する

私は多くの掘り下げをしてきましたが、この問題のアプローチは実際には見つかりませんでした。

私は事前にビルド中にこのような何かをできるようにしたいと思います:

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

は、誰もが前にこのような何かをやっていますか?

答えて

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プロパティに追加して後で処理することができます。

うまくいけば、これは他の人に役立つはずです。

0

多分、MsBuild拡張パックはあなたのためですか?既存の属性値を変更するには、MSBuild.ExtensionPack.Xml.XmlFileタスクとUpdateAttribute(http://www.msbuildextensionpack.com/help/3.5.11.0/html/4009fe8c-73c1-154f-ee8c-e9fda7f5fd96.htm)タスクがあります。それを行うには、file、xpath、およびvalueを定義する必要があります。しかし、私はこの例外が.netフレームワークの新しいバージョンで動作するかどうかはわかりません。

+0

ええと、これを調べる必要があります。これが私のために働くなら、これは私にその道の50%を得るでしょう。私は分岐を切り替えるときに、ブランチ名を動的に引き出す方法がまだ必要です。 – Anthony

+0

私は実際に自分自身では試してみることはできませんが、プレビルドイベントでバッチファイルを実行し、そのファイルの出力をmsbuildプロパティとして渡してタスクで使用することができます。そのバットファイルの中にgitコマンドを実行することができます:git rev-parse --abbrev-ref HEAD(このコマンドはあなたに現在のブランチを与えます)を出力としてエコーし、おそらくその出力を処理して後で使用する方法があります。 – luki

+0

バッチファイルが不要なので、Execを使ってgitを実行することができます(カレントディレクトリに頼る代わりに--git-dirと--work-treeを指定するのが最善です)。 – stijn

0

$ SolutionDirectoryにあるパスに依存しないことをお勧めします。値がそこにあるという保証はないので、任意のディレクトリでコードをチェックアウトしてルールを破ることができます。

これはビルドの自動化のためのものだと思いますか?独立して、あなたがおよそMSBuild Propertiesを覚えておくべきいくつかの重要なものがある自動化のために使用されているツールの:

  • プロパティ(これは制限することができ
  • プロパティは、コマンドラインからオーバーライドすることができ、あなたのMSBuildスクリプトで定義することができますスクリプトから)。
  • プロパティのMSBuild命名規則に従う環境変数は、プロパティとして解釈されます。これを考慮して

これは、あなたが何をする必要があるかです:

  1. (すなわち、マスターを開発)、デフォルト値を使用して、スクリプト内の「支店」プロパティを定義します。コマンドライン/環境変数から上書きできるようにします。

    <PropertyGroup> 
        <Branch Condition="'$(Branch)'==''">develop</Branch> 
    </PropertyGroup> 
    
  2. ビルドシステム(継続的インテグレーションサーバ)から良いと考え値を送信し、それがevironment変数やコマンドラインプロパティとしてすることができます。どのツールを使用しているかは関係ありません。すべてのツールがこれをサポートしています。 (TFS、TeamCity、CruiseControl.Netなど)これらの中には、ソースコントロールの設定に基づいて事前定義されたものがあります。他の場合は手動で行う必要があります。既存のビルドログを確認して、ブランチにすでに設定されているプロパティがあるかどうか、またはプロパティを適切に設定しているかどうかを確認できます。

  3. 必要に応じて、ビルド前のイベントの値を使用します。

    Visual Studioで開発目的のために

、右のプロジェクトをクリック> [プロパティ]> [デバッグ、「コマンドライン引数」フィールドの追加中:/P:ビルドします= yourbranchnameはあなたがそれVSからのビルドを実行したときになりますここで定義された値を使用してください。

関連する問題