私は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)...
入力には非常に感謝しています。
a)はいターゲットが実行される前に評価されているターゲットの外部にグローバルに定義されているため、b)はいです。これが問題です。私は100%確信していませんが、GetBranchName_TARGET内にClCompile *内のitemDefinitionGroupを置くと、 – stijn
@stijn:ありがとうございます。あなたのコメントは私を完璧な解決策にしました。 stukselbaxの答えと同じように。どうも! – mbusch