Ответ 1
Отличный вопрос! Я подробно написал об этом в book и в сообщении в блоге Элементы многоразовых скриптов MSBuild: проверка. Мой подход будет охватывать свойства и предметы.
Вот бег вниз. В общем файле .targets создайте цель проверки, и это должно быть одной из первых целей, объявленных в файле, чтобы пользователи могли легко найти их.
Свойства
Внутри цели проверки укажите свои свойства следующим образом:
<_RequiredProperties Include="Root">
<Value>$(Root)</Value>
</_RequiredProperties>
Я помещаю имя свойства в include и его значение внутри метаданных Value
. Причина, по которой я делаю это, заключается в том, что я могу обнаружить, когда Value
пуст, а затем я использую значение include для сообщите имя пропавшего имущества обратно пользователю.
Элементы
Внутри целевого места требуются элементы внутри элемента, например:
<_RequiredItems Include="AllConfigurations">
<RequiredValue>@(AllConfigurations)</RequiredValue>
</_RequiredItems>
Подобно свойствам, внутри include вы помещаете имя элемента, а затем значение, которое нужно проверить внутри метаданных RequiredValue
. В этом примере он просто проверяет, чтобы элемент AllConfiguraitons
не был пустым. Если вы хотите убедиться, что заданное значение метаданных указано для всех элементов, выполните следующие действия:
<_RequiredItems Include = "AllConfigurations.Configuration">
<RequiredValue>%(AllConfigurations.Configuration </RequiredValue>
</_RequiredItems>
Если вы хотите убедиться, что файл существует, добавьте дополнительные метаданные RequiredFilePath.
<_RequiredItems Include ="ProjectsToBuild">
<RequiredValue>%(ProjectsToBuild.Identity)</RequiredValue>
<RequiredFilePath>%(ProjectsToBuild.Identity)</RequiredFilePath>
</_RequiredItems>
Проверка
Вот что вам нужно для выполнения проверки
Полный пример
Вот полный пример
<Target Name="ValidateBuildSettings">
<ItemGroup>
<_RequiredProperties Include="Root">
<Value>$(Root)</Value>
</_RequiredProperties>
<_RequiredProperties Include="BuildInstallRoot">
<Value>$(BuildInstallRoot)</Value>
</_RequiredProperties>
<_RequiredProperties Include="SourceRoot">
<Value>$(SourceRoot)</Value>
</_RequiredProperties>
<!--
_RequiredItems is the item where required items should be placed.
The following metadata is significant:
REQUIRED METADATA:
Identity = This will basically be used to identify the specific required item
RequiredValue = This is the specific value that will be validated to exist
OPTIONAL METADATA
RequiredFilePath = Populate this with a path that should exists, if it is not empty
then it will be checked to exist on disk.
-->
<_RequiredItems Include="AllConfigurations">
<RequiredValue>@(AllConfigurations)</RequiredValue>
</_RequiredItems>
<_RequiredItems Include = "AllConfigurations.Configuration">
<RequiredValue>%(AllConfigurations.Configuration </RequiredValue>
</_RequiredItems>
<_RequiredItems Include ="ProjectsToBuild">
<RequiredValue>%(ProjectsToBuild.Identity)</RequiredValue>
<RequiredFilePath>%(ProjectsToBuild.Identity)</RequiredFilePath>
</_RequiredItems>
</ItemGroup>
<!-- Raise an error if any value in _RequiredProperties is missing -->
<Error Condition =" '%(_RequiredProperties.Value)'=='' "
Text=" Missing required property [%(_RequiredProperties.Identity)]" />
<!-- Raise an error if any value in _RequiredItems is empty -->
<Error Condition = " '%(_RequiredItems.RequiredValue)'=='' "
Text = " Missing required item value [%(_RequiredItems.Identity)] " />
<!-- Validate any file/directory that should exist -->
<Error Condition = " '%(_RequiredItems.RequiredFilePath)' != '' and !Exists('%(_RequiredItems.RequiredFilePath)') "
Text = " Unable to find expeceted path [%(_RequiredItems.RequiredFilePath)] on item [%(_RequiredItems.Identity)] " />
</Target>