基于目标平台在NuGet包props文件中定义编译常量不生效问题
问题原因
NuGet 对 build 文件夹下文件的默认导入顺序是导致条件失效的核心原因:
.props后缀文件会在消费项目自身的属性定义(包括<TargetFramework>的赋值逻辑)之前 被导入,此时$(TargetFramework)属性还未赋值,条件判断永远不成立。.targets后缀文件会在消费项目自身的所有属性定义完成之后 被导入,此时$(TargetFramework)已有确定值,条件判断可正常生效。
解决方案
方案1:改用.targets文件传递常量
- 新建
Common.targets文件,将原Common.props中的条件常量逻辑迁移过去,内容示例:
<Project> <PropertyGroup Condition="$(TargetFramework.StartsWith('uap10.0.17763')) Or $(TargetFramework.StartsWith('Xamarin.Mac'))"> <DefineConstants>$(DefineConstants);FEATURE_AVAILABLE</DefineConstants> </PropertyGroup> </Project>
- 修改包项目的打包配置,将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
相关产品推荐
相关产品推荐

