2011-11-14 15 views
15

El intento de crear una ItemGroup para su uso en un destino en el que los tipos de archivos son - Filename.CSS.ASPXMSBUILD Condición Evaluar propiedad contiene

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

En Compilar;

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 

¿Algún consejo sobre la ampliación de propiedades para evaluación?

+0

Es probable que quiere asegurarse de que todos los literales de cadena que se pasa a las funciones de propiedad como parámetros están debidamente citados. '$ (Property.Contains ('literal'))' not '$ (Property.Contains (literal))'. –

Respuesta

25

Por lo que yo sé, puede utilizar las funciones de cadena (como Contains en su código) sólo para propiedades, no para metadatos elemento. Pero intentó invocar Contains para %(Filename) y este es un metadato del artículo Content.

Para obtener más información, ver link to MSDN. El último párrafo dice estrictamente:

Es posible que las funciones de propiedad no aparezcan en los valores de los metadatos. Por ejemplo, %(Compile.FullPath.Substring(0,3)) no está permitido.

Sin embargo, puede utilizar los métodos estáticos de la clase Regex. Creo que el siguiente código es el que usted quería:

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

De lo contrario, puede modificar la expresión regular de cualquier manera que necesite.

5

En respuesta a una pregunta similar In MSBuild, can I use the String.Replace function on a MetaData item? se sugirió utilizar [System.String]::Copy() como solución para acceder a métodos no estáticos System.String.

Así código se puede escribir a:

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