gpt4 book ai didi

MSBuild 验证属性

转载 作者:行者123 更新时间:2023-12-02 02:04:03 25 4
gpt4 key购买 nike

我正在开发一个可重用的 MSBuild Target,它将被其他几个任务使用。该目标需要定义几个属性。验证属性是否已定义的最佳方法是什么,如果未定义则抛出错误?

几乎喜欢的两次尝试:

<?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="3.5" DefaultTarget="Release" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Target Name="Release">
<Error
Text="Property PropA required"
Condition="'$(PropA)' == ''"/>
<Error
Text="Property PropB required"
Condition="'$(PropB)' == ''"/>

<!-- The body of the task -->

</Target>
</Project>

这是批处理的尝试。由于额外的“Name”参数,它很难看。是否可以使用 Include 属性来代替?

<?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="3.5" DefaultTarget="Release" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Release">
<!-- MSBuild BuildInParallel="true" Projects="@(ProjectsToBuild)"/ -->
<ItemGroup>
<RequiredProperty Include="PropA"><Name>PropA</Name></RequiredProperty>
<RequiredProperty Include="PropB"><Name>PropB</Name></RequiredProperty>
<RequiredProperty Include="PropC"><Name>PropC</Name></RequiredProperty>
</ItemGroup>

<Error
Text="Property %(RequiredProperty.Name) required"
Condition="'$(%(RequiredProperty.Name))' == ''" />

</Target>

</Project>

最佳答案

问得好!我在我的book中对此进行了深入的描述。在一篇博客文章中,Elements of Reusable MSBuild Scripts: Validation 。我的方法将涵盖属性和元素。

这是概要。在共享的 .targets 文件中创建一个验证目标,这应该是文件中声明的第一个目标之一,以便用户可以轻松找到它。

属性

在验证目标内定义您的属性,如下所示:

<_RequiredProperties Include="Root">
<Value>$(Root)</Value>
</_RequiredProperties>

我将属性的名称放在 include 中,并将其值放在 Value 元数据中。这样做的原因是我可以检测 Value为空,然后我使用包含值将丢失的属性的名称报告给用户。

项目

在目标内将所需的项目放置在项目内,例如:

<_RequiredItems Include="AllConfigurations">
<RequiredValue>@(AllConfigurations)</RequiredValue>
</_RequiredItems>

与属性类似,在包含内容中放置项目名称,然后在 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>

关于MSBuild 验证属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2740827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com