根据目标平台在 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。
我正在构建一个多目标 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。