首页 > 解决方案 > 基于 NuGet PackageReference 定义一个 C# 预处理器符号

问题描述

NEWTONSOFT如果(且仅当)将 Newtonsoft.Json NuGet 包作为 PackageReference 添加到我的 .NET Core 应用程序时,我想定义一个符号。我怎样才能做到这一点?

编辑:为了澄清,如果引用存在,我想添加符号。如果我删除引用,则不应再定义符号 - 但我不应手动添加/删除符号定义。像这样的东西:

<Choose>
    <When Condition=" '$(PackageReference).Identity'=='Newtonsoft.Json' ">
        <PropertyGroup>
            <DefineConstants>HDN</DefineConstants>
        </PropertyGroup>
    </When>
</Choose>

除了这不起作用。

标签: .net-coremsbuildcsprojpreprocessor-directive

解决方案


一种自动执行此类操作的方法是包含一个目标,该目标将构建逻辑贡献到您的 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 根据目标框架或您的其他项目内容默认为您提供的任何内容。


推荐阅读