2011-11-14 5 views
15

入って評価 - Filename.CSS.ASPXMSBuildの条件は、プロパティファイルの種類があり、ターゲットで使用するitemgroupを作成しようと

コンパイルで
<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のような)文字列関数を使用することができます。しかし%(Filename)Containsを呼び出しようとしましたが、これは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メソッドにアクセスする回避策として[System.String]::Copy()を使用することの提案でした。あなたはおそらく、あなたがパラメータとしてプロパティ関数に渡す任意の文字列リテラルが適切に引用されていることを確認したいと思う

<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> 
関連する問題