msbuild - 为什么 MSBuild ItemGroup 条件不能在全局范围内工作

标签 msbuild

我非常好奇为什么我无法根据在目标内按预期工作的元数据条件在全局范围内创建项目。例如,这按预期工作:

<ItemGroup>
    <TestItems Include="TestItem1">
        <TestFlag>true</TestFlag>
    </TestItems>
    <TestItems Include="TestItem2">
        <TestFlag>false</TestFlag>
    </TestItems>
</ItemGroup>

<Target Name="Default">

    <Message Text="@(TestItems)" />
    <Message Text="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" />

    <ItemGroup>
        <FilteredTestItems Include="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" />
    </ItemGroup>

    <Message Text="@(FilteredTestItems)" />
    <Message Text="@(FilteredTestItems)" Condition="'%(FilteredTestItems.TestFlag)'=='true'" />

</Target>

并产生以下输出:

测试项目1;测试项目2 测试项目1 测试项目1 测试项目1

这按预期工作:

<ItemGroup>
    <TestItems Include="TestItem1">
        <TestFlag>true</TestFlag>
    </TestItems>
    <TestItems Include="TestItem2">
        <TestFlag>false</TestFlag>
    </TestItems>
</ItemGroup>

<ItemGroup>
    <FilteredTestItems Include="@(TestItems)" Condition="'false'=='true'" />
</ItemGroup>

<Target Name="Default">

    <Message Text="@(TestItems)" />
    <Message Text="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" />


    <Message Text="@(FilteredTestItems)" />
    <Message Text="@(FilteredTestItems)" Condition="'%(FilteredTestItems.TestFlag)'=='true'" />

</Target>

产生以下输出:

测试项目1;测试项目2 测试项目1

但是这个:

<ItemGroup>
    <TestItems Include="TestItem1">
        <TestFlag>true</TestFlag>
    </TestItems>
    <TestItems Include="TestItem2">
        <TestFlag>false</TestFlag>
    </TestItems>
</ItemGroup>

<ItemGroup>
    <FilteredTestItems Include="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" />
</ItemGroup>

产生以下 MSBuild 错误:

temp.proj(13,45):错误 MSB4090:在条件“'%(TestItems.TestFlag)'=='true'”的位置 2 处发现意外字符“%”。

那么什么给出了呢?当然我可以解决这个问题,但是我到底不了解 ItemGroup、元数据和/或全局范围?

最佳答案

项目组条件在目标之外起作用,但批处理则不起作用(即“%”运算符)。当您调用任务时会使用批处理,并且由于您只能从目标内部调用任务,因此批处理也只能在目标内部工作是有意义的。

您可能会问为什么项目组在目标内工作,因为它不是任务。在 MSBuild 3.5 之前,根本不允许您在目标内使用项目组;您必须改为调用CreateItem。在版本 3.5 和 4.0 中,允许以这种方式使用项目组,但我认为这只是调用 CreateItem 任务的语法糖,因此您的条件有效,因为有一个任务幕后花絮。

关于msbuild - 为什么 MSBuild ItemGroup 条件不能在全局范围内工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3265632/

相关文章:

linux - 从哪里获得适用于 Linux 的 msbuild

c++ - 有没有办法在 Visual Studio 中列出库依赖项?

svn - 从其他存储库收集更改时构建失败

MSBuild 扩展包简单教程

c# - .NET 构建和部署

asp.net - 在 TFS/版本控制中存储 IIS 配置的最佳实践

sdk - 如何在没有完整安装 Visual Studio 的情况下获得 MSBuild 15?

deployment - 使用 Cruise Control .Net 自动化 .Net 部署

c# - 如何在 .NET 核心中使用 .settings 文件?

.net - 配置 Jenkins 以在 Linux 平台上运行 MSBuild