MsBuild Условие Оценить Свойство Содержит - PullRequest
17 голосов
/ 15 ноября 2011

Попытка создать группу элементов для использования в цели с типами файлов - 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>

При компиляции;

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

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

Ответы [ 2 ]

31 голосов
/ 15 ноября 2011

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

Для получения более подробной информации см. ссылку на 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>

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

8 голосов
/ 13 мая 2014

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