.net-core - 基于 NuGet PackageReference 定义一个 C# 预处理器符号
问题描述
NEWTONSOFT
如果(且仅当)将 Newtonsoft.Json NuGet 包作为 PackageReference 添加到我的 .NET Core 应用程序时,我想定义一个符号。我怎样才能做到这一点?
编辑:为了澄清,如果引用存在,我想添加符号。如果我删除引用,则不应再定义符号 - 但我不应手动添加/删除符号定义。像这样的东西:
<Choose>
<When Condition=" '$(PackageReference).Identity'=='Newtonsoft.Json' ">
<PropertyGroup>
<DefineConstants>HDN</DefineConstants>
</PropertyGroup>
</When>
</Choose>
除了这不起作用。
解决方案
一种自动执行此类操作的方法是包含一个目标,该目标将构建逻辑贡献到您的 csproj 文件中,如下所示:
<Target Name="AddPackageSpecificConstants" BeforeTargets="BeforeCompile">
<PropertyGroup>
<DefineConstants Condition="@(Reference->AnyHaveMetadataValue('NuGetPackageId','Newtonsoft.Json'))">$(DefineConstants);NEWTONSOFT_JSON</DefineConstants>
<DefineConstants Condition="@(Reference->AnyHaveMetadataValue('NuGetPackageId','YamlDotNet '))">$(DefineConstants);YAML_DOT_NET</DefineConstants>
</PropertyGroup>
</Target>
通过挂钩到构建过程,这可以检测您的代码是否对特定 NuGet 包有任何编译时引用(意味着 pacakges 的 API 表面在您的 C# 代码中可用),即使它们只是被传递引用(例如,您引用引用 Newtonsoft.Json 的库,以便您可以使用它)。
通过<X>$(X);</X>
将附加常量之类的定义添加到属性中,这样就可以保留 SDK 根据目标框架或您的其他项目内容默认为您提供的任何内容。
推荐阅读
- php - 如何解决语法错误,意外的 '->' (T_OBJECT_OPERATOR) (0)
- google-apps-script - 在 Google 脚本中,有没有办法引用特定工作表而不是活动工作表?
- android - Android SDK:包含图标的许可证是什么?
- c# - 通过指定行号从表中选择一行 (Databse)
- laravel - 利用 laravel 资源返回 API 数据时更改键名
- c - 递归函数在C中打开文件后的错误文件描述符
- video - 我怎样才能使视频没有索引位置和总长度,就像原始比特流格式一样,但它可以有音频流?
- python-3.x - 连接变量 + 字符串给出 TypeError: can only concatenate list (not "str") to list
- mysql - SELECT MAX from COUNT,其他行变量不正确
- java - JUnits 中@RepositoryRestResource 的 url 上的 404