2017-05-09 3 views
3

複数のプロジェクトを持つソリューションがあります。ソリューションレベルで共通のファイルで一度定義された一連の共有プロパティにアクセスできるようにしたいと思います。インポートされたプロパティに基づくMSBuild条件

これはほとんどの場合、以下のコードを使用して正常に動作し、BeforeBuildターゲットでインポートされたプロパティを使用できますが、問題はインポートされたプロパティを条件で使用できないことです。

だから私は、ソリューションフォルダ内CommonSettings.targetsファイルに次のようしている:私は私のプロジェクトファイルで

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="CommonSettingsTarget"> 
     <PropertyGroup> 
      <MyCustomProperty>Sample</MyCustomProperty> 
     </PropertyGroup> 
    </Target> 
</Project> 

:上記で

<Project ToolsVersion="14.0" DefaultTargets="Build" InitialTargets="CommonSettingsTarget" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(SolutionDir)CommonSettings.targets" /> 

    <ItemGroup> 
    <EmbeddedResource Include="EmbeddedDocument.txt" Condition=" '$(MyCustomProperty)' == 'Sample' " /> 
    </ItemGroup> 

    <Target Name="BeforeBuild"> 
    <Message Text="MyCustomProperty='$(MyCustomProperty)'" Importance="high" /> 
    </Target> 
</Project> 

、私は私のインポートを見ることができますプロパティは "MyCustomProperty = 'Sample'"というように出力ウィンドウに表示されますが、条件の一部として使用されている場合(オプションで埋め込みリソースを含める場合)、条件は決して満たされません。

インポートされたプロパティを条件で動作させる方法はありますか?あなたの状態が評価されたときにCommonSettingsTargetがまだ実行されていないので、MyCustomPropertyがまだ定義されていない、あなたのItemGroupとして

+1

他のアドバイス:VS 2017/MSbuild 15に切り替えると、インポートされたファイル「Directory.Build.props」に名前を付けるだけで、そのレベル以下のすべてのプロジェクトに自動的にインポートされます。 –

答えて

3

は、目標の範囲内ではありませんが、PropertyGroupです。

タスクはBeforeBuildターゲット内から呼び出され、CommonSettingsTargetに依存するため、メッセージの作成時にMyCustomPropertyが定義されています。プロジェクトファイルにインポートしたプロジェクトをコピーするなどImport


と思います。結果はこのようなものになるだろう:

<Project ToolsVersion="14.0" DefaultTargets="Build" InitialTargets="CommonSettingsTarget" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="CommonSettingsTarget"> 
    <PropertyGroup> 
     <MyCustomProperty>Sample</MyCustomProperty> 
    </PropertyGroup> 
    </Target> 

    <ItemGroup> 
    <EmbeddedResource Include="EmbeddedDocument.txt" Condition=" '$(MyCustomProperty)' == 'Sample' " /> 
    </ItemGroup> 

    <Target Name="BeforeBuild"> 
    <Message Text="MyCustomProperty='$(MyCustomProperty)'" Importance="high" /> 
    </Target> 
</Project> 

これは何が起こるかです:

  1. あなたはそれが実行されたときMyCustomPropertyを定義するターゲットCommonSettingsTargetを定義します。今はやめろ。
  2. ItemGroupを定義して、条件を評価します。 MyCustomPropertyがまだ定義されていないため、falseを返します。
  3. BeforeBuildというターゲットを定義します。
  4. 最初のターゲットを実行します。つまり、CommonSettingsTargetです。今すぐMyCustomPropertyが定義されています。
  5. BeforeBuildに依存するデフォルトターゲットを実行すると、BeforeBuildが実行されます。そこには、解決策として

ステップ4で定義されているMyCustomPropertyを評価し、CommonSettingsTargetターゲットを削除し、CommonSettingsでProjectの子としてPropertyGroupを定義します。代わりにターゲット:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <MyCustomProperty>Sample</MyCustomProperty> 
    </PropertyGroup> 
</Project> 

InitialTargets="CommonSettingsTarget"を削除する必要があります。

+0

info wklありがとう。プロジェクトのプロパティを具体的に定義すると機能しますが、ソリューションにはプロパティにアクセスする必要があるプロジェクトがたくさんあります。調整するたびに、各プロジェクトの値を変更する必要がありますそれら。私はプロジェクト自体のInitialTargetsがそれをしているかもしれないと思ったが、条件が常に輸入前に評価されているように見える? –

+0

@DanielSmith私の編集をご覧ください。 – wkl

+0

私は今あなたがwklを意味するものを見ます。私の共通のプロパティを完全にインポートして使用しています。私は間違いなくすべてのそれらのターゲットでそれを複雑にしていました。ありがとうございます - 私は答えとしてマークします:-) –

関連する問題