MsBuild条件评估属性包含

19
尝试创建一个itemgroup,用于在目标中使用文件类型为“Filename.CSS.ASPX”。
<Target Name="Test" AfterTargets="Build">
    <Message Text="Project $(ProjectName) Test PostBuild" Importance="high" />
    <Message Text="%(Content.FullPath)" Condition="%(Extension) == '.aspx' AND %(Filename.Contains(css))" Importance="high" />
</Target>

编译时;

Error   1   Expected "%(Filename.Contains(css))" to evaluate to a boolean instead of "%(Filename.Contains(css))", in condition "%(Extension) == '.aspx' AND %   (Filename.Contains(css))".  C:\Projects\TestProj\TestProj\TestProj.csproj   58  38  TestProj

有关于扩展属性以进行评估的建议吗?


1
你可能需要确保将传递给属性函数作为参数的任何字符串字面值都正确引用。使用$(Property.Contains('literal'))而不是$(Property.Contains(literal)) - Michael Price
2个回答

36
据我所知,你只能在代码中使用字符串函数(如Contains),用于属性而非项元数据。但你尝试调用Contains来搜索%(Filename),这是Content项的元数据。
要获取更多详情,请参见MSDN链接。最后一段明确说明:
  

属性函数不得出现在元数据值中。例如,   %(Compile.FullPath.Substring(0,3))   不被允许。

然而,你可以使用Regex类的静态方法。我认为以下代码就是你想要的:
<Target Name="Test" AfterTargets="Build">
    <Message Text="Project $(ProjectName) Test PostBuild" Importance="high" />
    <Message Text="%(Content.FullPath)" Condition=" $([System.Text.RegularExpressions.Regex]::IsMatch('%(FullPath)', '.+\.css\.aspx')) " Importance="high" />
</Target>

如果没有,您可以按照您需要的任何方式修改正则表达式。


14

针对类似问题的回答In MSBuild, can I use the String.Replace function on a MetaData item?建议使用[System.String]::Copy()作为解决方法来访问非静态的System.String方法。

因此,代码可以重写为:

    <Target Name="Test" AfterTargets="Build">
        <Message Text="Project $(ProjectName) Test PostBuild" Importance="high" />
        <Message Text="%(Content.FullPath)" Condition="%(Content.Extension) == '.aspx' AND $([System.String]::Copy(%(Content.Filename)).Contains('css'))" Importance="high" />
    </Target>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接