2017-05-09 89 views
3

我有一個包含多個項目的解決方案,我希望它們都能訪問一組共享屬性,這些屬性在解決方案級別的普通文件中定義過一次。基於導入屬性的MSBuild條件

這大多工作正常,使用下面的代碼,我可以在BeforeBuild目標中使用導入的屬性,但是我遇到的問題是我無法在條件中使用導入的屬性。

<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> 

在上,我可以看到我的進口

所以我的在解決一個文件夾中的文件CommonSettings.targets以下屬性在輸出窗口中顯示爲「MyCustomProperty ='Sample'」,這很棒,但是當它用作條件的一部分(可選地包含嵌入資源)時,條件永遠不會滿足。

有什麼辦法可以使導入的屬性在條件下工作嗎?

+1

其他一些建議:如果您切換到VS 2017/MSbuild 15,您可以簡單地命名導入的文件「Directory.Build.props」,它會自動導入到該級別以下的所有項目中。 –

回答

3

由於您的ItemGroup不在目標範圍內,但PropertyGroup爲,CommonSettingsTarget尚未在評估條件時執行,因此尚未定義MyCustomProperty

Message任務在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. 你定義一個目標CommonSettingsTarget,當它被執行將定義MyCustomProperty。不是現在。
  2. 您定義ItemGroup並因此評估條件。它返回false,因爲MyCustomProperty尚未定義。
  3. 您定義目標BeforeBuild
  4. 您運行初始目標,即CommonSettingsTarget。現在定義了MyCustomProperty
  5. 您運行的默認目標取決於BeforeBuild,因此運行BeforeBuild。在那裏,你評估已在步驟4

作爲解決方案被定義MyCustomProperty,除去CommonSettingsTarget目標和定義PropertyGroupProject的CommonSettings一個孩子。目標改爲:

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

在你的項目文件,你應該刪除InitialTargets="CommonSettingsTarget"即可。

+0

感謝您的信息wkl。如果我專門定義了項目中的屬性,它確實有效,但是我在解決方案中有很多項目需要訪問屬性,並且每次需要調整時都會更改每個項目中的值他們。我認爲項目本身的InitialTargets可能已經做到了,但是,看起來條件總是在任何導入之前進行評估? –

+0

@DanielSmith請看我的編輯。 – wkl

+0

我明白你的意思是現在wkl。它現在完美地導入和使用我的共同屬性。所有這些目標我絕對過分複雜。非常感謝 - 我將標記爲答案:-) –