【问题标题】:Why the `Condition` attribute doesn't work for the `ItemGroup` element?为什么 `Condition` 属性不适用于 `ItemGroup` 元素?
【发布时间】:2015-05-05 06:10:32
【问题描述】:

MS Visual Studio 2013。

WhenItemGroup 元素都可以具有 Condition 属性(正如我在 MSDN 中看到的那样)。但我得到了不同的结果。

$(CAD_Year) 是 2015 年时,我预计 AcRibbon引用到我的项目:

<ItemGroup Condition= "'$(CAD_Year)' &lt; '2010'" >    
  <Reference Include="AcRibbon">
    <HintPath>$(CAD_SDK_Location)\$(Inc)\AcRibbon.dll</HintPath>
    <Private>False</Private>
  </Reference>
</ItemGroup>

但我总是在解决方案浏览器中得到未解决的引用 AcRibbon

但是这个变体可以正常工作:

<Choose>
  <When Condition= "'$(CAD_Year)' &lt; '2010'">
    <ItemGroup>
      <Reference Include="AcRibbon">
        <HintPath>$(CAD_SDK_Location)\$(Inc)\AcRibbon.dll</HintPath>
        <Private>False</Private>
      </Reference>
    </ItemGroup>
  </When>
</Choose>

在这种情况下,AcRibbon 仅在 $(CAD_Year) 小于 2010 时被引用。 为什么我得到不同的结果?

【问题讨论】:

  • 第一个样本中的 ItemGroup 是全局的(在任何目标之外定义)吗?如果是这样,一个可能的原因是条件评估顺序。在任何目标运行之前计算全局 ItemGroup 的条件。本地 ItemGroup 的条件在父目标运行时计算。全局属性在任何 ItemGroups 和目标之前计算。
  • 你确定它不起作用吗?当您更改构建配置时,Visual Studio 不太擅长显示条件引用,尤其是在不同的构建配置引用具有相同名称的事物时。测试它是否真的有效的唯一方法是构建它。有时,您会在解决方案资源管理器上的狡猾参考中得到一个交叉 - 不理会它是安全的。
  • 是的,我确定。此代码位于我的外部props-文件中。我通过Import xml 元素将其内容导入到我的csproj 文件中。
  • 解决方案浏览器中未解决的参考,与 CAD 专家所说的不完全相关;你的项目建立了吗?显示的代码工作正常。如果添加显示 @(Reference) 的目标,那么当 CAD_Year 为 2015 时,您将看到 Reference 为空,并且在 CAD_Year 为例如时包含 AcRibbon 两次。 2008.

标签: visual-studio visual-studio-2013 msbuild


【解决方案1】:

我在 MSDN here找到了答案:

虽然条件导入语句在命令行 MSBuild 中有效,但 它们不适用于集成的 Visual Studio 中的 MSBuild 开发环境(IDE)。条件导入由 使用设置时的配置和平台值 项目已加载。如果随后进行的更改需要 重新评估项目文件中的条件,例如, 改变平台,Visual Studio 重新评估条件 属性和项目,但不包括进口。因为进口 不重新评估条件,跳过导入。解决方法 这个,将条件导入放在 .targets 文件中或将代码放在 条件块,例如选择元素 (MSBuild) 块。

我认为ItemGroup 元素也是如此......

【讨论】:

  • 非常有用的答案。在 IDE 中无法访问 MSBuild 的许多可能性,我觉得有点奇怪。
  • 注意:这在 Visual Studio for Mac(版本 7.5.3)中不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 2023-01-03
  • 2021-12-24
  • 2016-02-15
  • 1970-01-01
  • 2020-03-09
相关资源
最近更新 更多