繁体   English   中英

基于目标平台的NuGet包的props中的DefineConstant

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

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

<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>

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

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

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

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

问题是它不尊重在我的主项目中包装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 以满足我的需要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM