.net core 基于NuGet PackageReference定义C#预处理器符号
如果(且仅当)NEWTONSOFT.Json NuGet包作为PackageReference添加到我的.NET核心应用程序中,我想定义一个符号.net core 基于NuGet PackageReference定义C#预处理器符号,.net-core,msbuild,csproj,preprocessor-directive,.net Core,Msbuild,Csproj,Preprocessor Directive,如果(且仅当)NEWTONSOFT.Json NuGet包作为PackageReference添加到我的.NET核心应用程序中,我想定义一个符号NEWTONSOFT。我该怎么做 编辑:为了澄清,我想添加符号,如果存在引用。如果删除引用,则不应再定义符号-但不应手动添加/删除符号定义。大概是这样的: <Choose> <When Condition=" '$(PackageReference).Identity'=='Newtonsoft.Json' "
NEWTONSOFT
。我该怎么做
编辑:为了澄清,我想添加符号,如果存在引用。如果删除引用,则不应再定义符号-但不应手动添加/删除符号定义。大概是这样的:
<Choose>
<When Condition=" '$(PackageReference).Identity'=='Newtonsoft.Json' ">
<PropertyGroup>
<DefineConstants>HDN</DefineConstants>
</PropertyGroup>
</When>
</Choose>
<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>
HDN
除非这不起作用。您可以在
项目属性
的调试
选项卡中添加条件编译符号
,并使用如下Roslyn预处理器指令:
#if NEWTONSOFT && !JSON.NET
// Your Codes
#endif
基于Microsoft Docs,您没有任何适用于
Nuget
软件包的预处理器指令。您可以在项目属性的调试
选项卡中添加条件编译符号
,并使用如下Roslyn预处理器指令:
#if NEWTONSOFT && !JSON.NET
// Your Codes
#endif
基于Microsoft Docs,您没有任何适用于Nuget
软件包的预处理器指令。自动执行此类操作的一种方法是在csproj文件中包含一个目标,该目标将生成逻辑如下所示:
<Choose>
<When Condition=" '$(PackageReference).Identity'=='Newtonsoft.Json' ">
<PropertyGroup>
<DefineConstants>HDN</DefineConstants>
</PropertyGroup>
</When>
</Choose>
<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>
美元(定义常量);NEWTONSOFT_JSON
美元(定义常量);YAML_DOT_NET
通过连接到构建过程,这可以检测您的代码是否有任何编译时引用(意味着包的API表面在您的C#代码中可用)到特定的NuGet包,即使它们只是传递性引用(例如,您引用了一个引用Newtonsoft.Json的库,以便您可以使用它)
通过执行定义,如$(X)代码>附加常量被添加到属性中,因此这将保留SDK根据目标框架或其他项目内容默认提供给您的任何内容。自动执行此类操作的一种方法是在csproj文件中包含一个提供构建逻辑的目标,如下所示:
<Choose>
<When Condition=" '$(PackageReference).Identity'=='Newtonsoft.Json' ">
<PropertyGroup>
<DefineConstants>HDN</DefineConstants>
</PropertyGroup>
</When>
</Choose>
<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>
美元(定义常量);NEWTONSOFT_JSON
美元(定义常量);YAML_DOT_NET
通过连接到构建过程,这可以检测您的代码是否有任何编译时引用(意味着包的API表面在您的C#代码中可用)到特定的NuGet包,即使它们只是传递性引用(例如,您引用了一个引用Newtonsoft.Json的库,以便您可以使用它)
通过执行定义,如$(X)代码>额外的常量被添加到属性中,因此这将保留SDK根据目标框架或其他项目内容默认提供给您的任何内容。是的,对不起,我应该更清楚一些。当PackageReference出现时,我想“自动”添加它们。据我所知,对于Nuget Packages
,没有“自动”的预处理器指令。但是,我必须提到Cake.Recipe
的一些选项。(例如,附加指令)。是的,对不起,我应该说得更清楚些。当PackageReference出现时,我想“自动”添加它们。据我所知,对于Nuget Packages
,没有“自动”的预处理器指令。但是,我必须提到Cake.Recipe
的一些选项。(例如,附加指令)。抱歉耽搁了,回答得很好!抱歉耽搁了,回答得很好!