2016-05-21 6 views
2

私はmsbuildカスタムターゲットと値を計算するタスクを持っています。 タスクはプロパティとして値を出力します。 このプロパティは、コンパイラ呼び出しの追加オプションとして使用します。コンパイラカスタムターゲットで計算された追加オプション

ただし、追加オプションとして使用するとプロパティは空です。

マイ* .targets

ファイルは次のようになります。
<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <UsingTask TaskName="GetBranchName_TASK" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > 
    <ParameterGroup> 
     <sPath ParameterType="System.String" Required="true" /> 
     <sBranchName ParameterType="System.String" Output="true" /> 
    </ParameterGroup> 
    <Task> 
     <Code Type="Fragment" Language="cs"> 
     <![CDATA[ 
      ... some Code ... 
     ]]> 
     </Code> 
    </Task> 
    </UsingTask> 

    <Target Name="GetBranchName_TARGET"> 
    <GetBranchName_TASK sPath="$(MSBuildThisFileDirectory)"> 
     <Output PropertyName="BranchName" TaskParameter="sBranchName" /> 
    </GetBranchName_TASK> 
    <Message Importance="High" Text="BranchName = $(BranchName)" /> 
    </Target> 

    <PropertyGroup> 
    <BuildDependsOn> 
     GetBranchName_TARGET; 
     $(BuildDependsOn); 
    </BuildDependsOn> 
    </PropertyGroup> 
</Project> 

マイ *ファイルはこのようなものです.props:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup Label="Configuration"> 
    ... some Properties here ... 
    </PropertyGroup> 
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> 
    <Import Project="IRSGetBranchName.targets" /> 
    <ItemDefinitionGroup> 
    <ClCompile> 
     <AdditionalOptions>/DBRANCHNAME=$(BranchName) /DMORE=BAR</AdditionalOptions> 
    <ClCompile> 
    <ItemDefinitionGroup> 
</Project> 

がこの.propsファイルがインポートされますいくつかに .vcxproj

私のGetBranchName_TARGETにメッセージとして印刷された値は、正しい(正しいTFSブランチ名を示しています)ように正しいです。 しかし詳細なビルド出力を見たときに、値は空のようだ:

1>ClCompile 
1> ..\FOO.cpp 
1>  AdditionalOptions = /DBRANCHNAME= /DMORE=BAR 

私は時間のために試みたが、何の解決策を見つけていないと私は本当に誰かがいただきました!ここで間違って助けを願って...

a)は、プロパティBranchNameはグローバルに利用できませんか?他のカスタムターゲットからプロパティを印刷しようとしましたが、うまくいきました!

b)または、ターゲットが実行される前に、評価/ビルドされたClCompile.AdditionalOptions?この場合、どのように再評価することができますか?

c)...

入力には非常に感謝しています。

+0

a)はいターゲットが実行される前に評価されているターゲットの外部にグローバルに定義されているため、b)はいです。これが問題です。私は100%確信していませんが、GetBranchName_TARGET内にClCompile *内のitemDefinitionGroupを置くと、 – stijn

+0

@stijn:ありがとうございます。あなたのコメントは私を完璧な解決策にしました。 stukselbaxの答えと同じように。どうも! – mbusch

答えて

0

hereが説明するように、MSBuildの評価プロセスに精通している必要があります。

のMSBuildエンジンは、ビルドファイルの処理を開始すると、それはマルチパス方式で、トップダウンで評価され、 。これらのパスは、次のリストで順番に説明されています。

  1. すべての環境、グローバルプロパティ、およびツールセットプロパティをロードします。たとえば、Microsoft Visual Studio 2010では、C++はMSBuild 4.0ツールセットのいくつかのプロパティを定義しています。
  2. 遭遇したよう
  3. 項目を評価
  4. は、スタートがあなたのケースで、だから、

を構築し、読み取り対象タスク

  • を使用して評価項目の定義を評価
  • 特性やプロセスの輸入を評価ItemDefinitionGroupClCompile)は、の前に評価されていますGetBranchName_TARGET実行されました。したがって、それは設計によって空です。

    希望の動作を実現するために、次を追加する必要があります

    <Target Name="GetBranchName_TARGET"> 
        <GetBranchName_TASK sPath="$(MSBuildThisFileDirectory)"> 
        <Output PropertyName="BranchName" TaskParameter="sBranchName" /> 
        </GetBranchName_TASK> 
        <Message Importance="High" Text="BranchName = $(BranchName)" /> 
        <ItemGroup> 
        <ClCompile> 
         <AdditionalOptions>/DBRANCHNAME=$(BranchName) /DMORE=BAR</AdditionalOptions> 
        </ClCompile> 
        </ItemGroup> 
    </Target> 
    

    あなたは、たとえば、あなただけのソースを含めるためにClCompileでCondition属性を使用することができます。実際には、あなたが探しているのはitem metadata after it was declaredを変更する機能です。

  • 関連する問題