2011-11-14 15 views
15

Próba stworzenia ItemGroup do użycia w docelowym gdzie typy plików - Filename.CSS.ASPXmsbuild Stan ocenić właściwość zawiera

<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> 

podczas kompilacji;

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 

Jakieś rady dotyczące rozbudowy nieruchomości do oceny?

+0

Prawdopodobnie będziesz chciał się upewnić, że wszystkie literały ciągów znaków, które przechodzą do funkcji własności jako parametry są prawidłowo cytowane. '$ (Property.Contains ('literal'))' not '$ (Property.Contains (literal))'. –

Odpowiedz

25

O ile wiem, można użyć funkcji string (jak Contains w kodzie) tylko dla właściwości, nie metadanych poz. Ale próbowałeś wywołać Contains dla %(Filename) i jest to metadane elementu o nazwie Content.

Aby uzyskać więcej informacji, patrz link to MSDN. Ostatni akapit ściśle mówi:

Funkcje właściwości mogą nie pojawiać się w ramach wartości metadanych. Na przykład %(Compile.FullPath.Substring(0,3)) jest niedozwolone.

Można jednak użyć metod statycznych klasy Regex. Uważam, że poniższy kod jest tym, czego potrzebujesz:

<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> 

Jeśli nie, możesz zmodyfikować wyrażenie regularne w dowolny sposób.

5

W odpowiedzi na podobne pytanie In MSBuild, can I use the String.Replace function on a MetaData item? była sugestia, aby użyć [System.String]::Copy() jako obejścia w celu uzyskania dostępu do metod nie statycznych System.String.

więc kod może być przepisany do:

<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> 
Powiązane problemy