Условие оценки 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>

On Compile;

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

Любые советы по расширению свойств для оценки?

Ответы

Ответ 1

Насколько я знаю, вы можете использовать строковые функции (например, Contains в вашем коде) только для свойств, а не для метаданных элементов. Но вы пытались вызвать Contains для %(Filename), и это метаданные элемента Content.

Подробнее см. ссылка на 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>

Если нет, вы можете изменить регулярное выражение так, как вам нужно.

Ответ 2

В ответ на аналогичный вопрос В MSBuild я могу использовать функцию String.Replace в элементе MetaData? предлагалось использовать [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>