You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于目标平台在NuGet包props文件中定义编译常量不生效问题

问题原因

NuGet 对 build 文件夹下文件的默认导入顺序是导致条件失效的核心原因:

  • .props 后缀文件会在消费项目自身的属性定义(包括 <TargetFramework> 的赋值逻辑)之前 被导入,此时 $(TargetFramework) 属性还未赋值,条件判断永远不成立。
  • .targets 后缀文件会在消费项目自身的所有属性定义完成之后 被导入,此时 $(TargetFramework) 已有确定值,条件判断可正常生效。

解决方案

方案1:改用.targets文件传递常量

  1. 新建 Common.targets 文件,将原 Common.props 中的条件常量逻辑迁移过去,内容示例:
<Project>
  <PropertyGroup Condition="$(TargetFramework.StartsWith('uap10.0.17763')) Or $(TargetFramework.StartsWith('Xamarin.Mac'))">
    <DefineConstants>$(DefineConstants);FEATURE_AVAILABLE</DefineConstants>
  </PropertyGroup>
</Project>
  1. 修改包项目的打包配置,将targets文件打包到对应路径:
<ItemGroup>
  <!-- 直接引用包的项目可获取常量 -->
  <None Include="Common.targets" Pack="true" PackagePath="build" />
  <!-- 如需间接引用包的项目也能获取常量,新增如下配置 -->
  <!-- <None Include="Common.targets" Pack="true" PackagePath="buildTransitive" /> -->
</ItemGroup>

删除原无用的 Common.props 相关配置后重新打包即可。

方案2:通过Target设置常量(兼容性更强)

如果担心仍有属性初始化顺序问题,可以用编译前运行的Target来设置常量,完全规避顺序问题,Common.targets 内容示例:

<Project>
  <Target Name="AddFeatureAvailableConstant" BeforeTargets="BeforeCompile">
    <PropertyGroup Condition="$(TargetFramework.StartsWith('uap10.0.17763')) Or $(TargetFramework.StartsWith('Xamarin.Mac'))">
      <DefineConstants>$(DefineConstants);FEATURE_AVAILABLE</DefineConstants>
    </PropertyGroup>
  </Target>
</Project>

打包配置和方案1一致即可。

内容的提问来源于stack exchange,提问作者Sergey Metlov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:15:00