MsBuild条件评估属性包含

时间:2011-11-14 23:49:44

标签: msbuild

尝试创建一个用于文件类型为的目标的项目组 - 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

有关扩展评估属性的建议吗?

2 个答案:

答案 0 :(得分:30)

据我所知,您可以在属性中使用字符串函数(例如代码中的Contains),而不是项元数据。但您尝试为Contains调用%(Filename),这是Content项的元数据。

要了解更多详情,请参阅link to 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>

如果没有,您可以以任何方式修改正则表达式。

答案 1 :(得分:6)

回答类似问题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>