Хотя проверка значений свойств (или их отсутствие) заключается в том, как почти все выполняется в MSBuild, иногда существуют другие способы.
Как узнать, является ли текущий проект MSBuild SDKпроект?
Другими словами:
- с данным файлом XML ...
- , полный путь которого находится в скважине
MSBuildProjectFullPath
-известное свойство ... - и первый тег которого
Project
... - имеет ли указанный тег атрибут
Sdk
?
Благодаря функциям свойства MSBuild вы можете сделать следующее:
- использовать
[System.IO.File]::ReadAllText
для чтения содержимого файла проекта в виде строки; - , а затем использовать
[System.Text.RegularExpressions.Regex]::IsMatch
для проверки тега Project
с атрибутом Sdk
.
<PropertyGroup>
<_ProjectContents>$([System.IO.File]::ReadAllText(`$(MSBuildProjectFullPath)`))</_ProjectContents>
<_SdkRegex>(?s-i)(^|\s|>)<Project\s(([^>]*?)\s)?Sdk(\s*?)=(\s*?)"</_SdkRegex>
<_IsSdkProject>$([System.Text.RegularExpressions.Regex]::IsMatch(`$(_ProjectContents)`, `$(_SdkRegex)`))</_IsSdkProject>
</PropertyGroup>
Или, если вы предпочитаете однострочное:
<PropertyGroup>
<_IsSdkProject>$([System.Text.RegularExpressions.Regex]::IsMatch(`$([System.IO.File]::ReadAllText(`$(MSBuildProjectFullPath)`))`, `(?s-i)(^|\s|>)<Project\s(([^>]*?)\s)?Sdk(\s*?)=(\s*?)"`))</_IsSdkProject>
</PropertyGroup>
ТогдаВы можете использовать значение _IsSdkProject
, которое будет True
ИЛИ False
в Condition
, например:
<PropertyGroup Condition="'$(_IsSdkProject)'=='True'">
<SomeProperty>SomeValue</SomeProperty>
</PropertyGroup>
Регулярное выражение объяснено
ВВыше регулярного выражения символы <
и >
были заменены на объекты XML (<
и >
соответственно).Исходное регулярное выражение выглядит следующим образом:
(?s-i)(^|\s|>)<Project\s(([^>]*?)\s)?Sdk(\s*?)=(\s*?)"
Что означает:
- В однострочный, чувствительный к регистру режим ...
- Либо в начале файла, либо после символа пробела, либо после символа
>
... - найдите буквенную строку
<Project
... - затем символ пробела ...
- затем, произвольно, любое число любого символа, кроме
>
, и еще один символ пробела ... - затем буквенная строка
Sdk
... - , затем, по выбору, любое количество символов пробела ...
- , затем символ
=
... - , затем, по выбору, любойколичество пробелов ...
- затем символ
"
Лучшее объяснение, вместе с онлайн-тестером, куда вы можете вставить содержимое файлов вашего проекта и проверитьв режиме реального времени - на regex101.com .Сайт был создан для регулярных выражений Javascript, которые не ведут себя точно , как в .NET, но в любом случае это полезно.