2017-09-01 19 views
0

這感覺就像它是如此簡單,但我不能得到它的工作。MSBuild過濾項目文件組的條件

我試圖實現的是嵌入式資源的過濾列表。我嘗試了各種方法,但我似乎無法做到。

這就是我的想法是正確的解決方案:

<ItemGroup> 
    <AllEmbeddedResources Include="@(EmbeddedResource)" Condition="$(FullPath.Contains('Change')"/> 
</ItemGroup> 

編輯... 爲了澄清,結果是沒有條件的,該列表是所有嵌入的資源,條件,該組是空的。

我試過這個內部和外部的目標的,我試過讓一個組中的完整列表,然後過濾在一個單獨的組。我知道我只是誤解了msbuild語法的一些基本部分,我似乎無法解決這個問題。期待顯示我愚蠢的錯誤!

<Target Name="ListAllEmbeddedResources"> 
    <ItemGroup> 
    <AllEmbeddedResources Include="@(EmbeddedResource)" Condition="$([System.String]::Copy(%(FullPath)).Contains('Change'))" /> 
    </ItemGroup> 
    <Message Importance="high" Text="AllEmbeddedResources: %(AllEmbeddedResources.Identity)" /> 
</Target> 

注意,這個語法只能目標內:

+0

'$'用於引用屬性。你想引用元數據,這是使用'%'完成的,所以對於初學者你應該'%(FullPath ...'。但是我100%肯定這個問題已經被問過了,所以只是搜索。 – stijn

+0

@stijn所以我想同樣的,但如果我使用這種語法[條件=「%(FullPath).Contains('更改')」]我得到錯誤[錯誤MSB4092:一個意外的標記「。」被發現在字符位置12 incond ition 「%(FullPath).Contains('Change')」。]類似的問題已經被問到,但無論我做什麼遵循他們的例子,它似乎都不夠接近。嘗試... – Adam

+0

@Adam你需要在靜態評估(項目全局)期間還是目標內部執行此操作?在靜態評估期間很難做到這一點。 –

回答

1

目標裏面,這可以使用的物品配料語法和使用System.String.Copy方法能夠調用的字符串實例函數來完成而不是在靜態評估期間(直接在<Project>節點下的項目組)。

+0

完美的作品!謝謝!很高興我不僅僅是在愚蠢......讓我感到失望的是它太無聊了! – Adam