根据目标平台在 NuGet 包的 props 中定义常量

DefineConstant in NuGet package's props based on the target platform

我正在构建一个多目标 NuGet 包,我希望它为消费者提供一个编译常量:

<TargetFrameworks>Xamarin.Mac20;netstandard2.0;uap10.0.17763</TargetFrameworks>

我希望某项功能仅适用于其中两个目标。为此,我定义了一个自定义常量:

<PropertyGroup Condition="$(TargetFramework.StartsWith('uap10.0.17763')) Or $(TargetFramework.StartsWith('Xamarin.Mac'))">
    <DefineConstants>$(DefineConstants);FEATURE_AVAILABLE</DefineConstants>
</PropertyGroup>

现在我不仅要在我要从中创建包的当前程序集中使用这个常量,而且还要在使用者项目中使用这个常量。为此,我创建了一个 Common.props 文件并将其包含在包中:

<Import Project="Common.props" />
<ItemGroup>
  <None Include="Common.props" Pack="true" PackagePath="build" />
</ItemGroup>

构建后我可以确认我的 Common.props 已添加到包中并且我可以在主项目中成功使用它。

主项目针对与包项目相同的 3 个平台。现在我只想使用从包中导入的 FEATURE_AVAILABLE,这样我就可以只使用包中的可用代码。

问题 是它不尊重包装我主项目中 DefineConstants 指令的平台条件,就像它是在 MSBuild 知道目标框架之前执行的一样它将为。如果我删除条件,常量在我的主项目代码中可用。有了条件就不会了。

事实证明 Nuget 不尊重 Xamarin.Mac20 作为目标名称,尽管 dotnet 本身尊重。恢复包时,Nuget 会生成自己的 PROJECT_NAME.csproj.nuget.g.props 文件,其中包含以下行(已清理和消毒):

<ImportGroup Condition=" '$(TargetFramework)' == 'xamarinmac20'">
  <Import Project="$(NuGetPackageRoot)MY_NUGET_NAME/VERSION/build/FILE.props" />
</ImportGroup>

将目标框架从 Xamarin.Mac20 更改为 xamarinmac20 即可解决问题。我真的不想为我所有的依赖项目都这样做,所以我要么手动包含完整的导入行,要么找到一种方法来根据我的需要配置 Nuget。