2017-09-01 16 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