2011-11-14 147 views
15

试图创建在目标使用的ItemGroup所在的文件类型 - Filename.CSS.ASPX的MSBuild条件评估属性包含

<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 

有关扩展属性以进行评估的任何建议?

+0

你可能想确保你传递给物业功能参数的任何字符串文字被正确引用。 '(Property.Contains('literal'))'不是'$(Property.Contains(literal))''。 –

回答

25

据我所知,您可以使用字符串函数(比如在你的代码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> 

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

5

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