如何 Isolate/Ignore 使用条件开关构建 NuGet 包?

How to Isolate/Ignore a NuGet package on build using a conditional switch?

我在项目中使用了 NuGet 包。有没有办法隔离或忽略该 NuGet 包并使用另一个使用编译开关或宏的 NuGet 包?

目的:此 NuGet 包是按开发人员许可的,因此目的是在开发过程中与其他开发人员断开连接。

我调查过 myproject.csproj

...
<ItemGroup>
    <PackageReference Include="nugetPackage2Exclude" Version="1.0.0.0">
        <ExcludeAssets>none</ExcludeAssets>
    </PackageReference>
...

但是,我无法使用编译开关或宏使其工作。

经过大量修补。这是满足我所有要求的最终解决方案。有点长,我把这个问题相关的所有发现都加进去了。

在开始实施之前,这是我的设置 #(.NET 6.0, C# 10, WPF 项目, VS2022)

涉及的步骤!

  1. 编译开关声明
  2. compiling/ignoring Nuget 包
  3. 的预构建条件开关
  4. XAML 文件中的上下文切换。
  5. 编译开关以隔离 C# 文件中的程序包。

Step1: 编译开关声明(NUGET_ENABLE)

项目 -> 属性 -> 条件编译符号

$(DefineConstants);NUGET_ENABLE

(Note: A value cannot be assigned to the NUGET_ENABLE, The NUGET_ENABLE has to be renamed or removed for Removing this NuGet Usage.)

第 2 步:compiling/ignoring Nuget 包

的预构建条件开关

打开myproject.csproj(项目文件)。 使用正则表达式从 $(DefineConstants) 中找到特定的编译开关,如果 NUGET_ENABLE 存在编译 NuGet 包。

(参考:MS Docs

    <Choose>
    <When Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(DefineConstants), '^(.*;)*NUGET_ENABLE(;.*)*$'))">
        <!-- When NUGET_ENABLE is defined. -->
        <ItemGroup>
            <PackageReference Include="nugetPackage2Exclude" Version=""/>
        </ItemGroup>
    </When>
    </Choose>

Step3: XAML 文件中的上下文切换

(参考:this question

Step3a:编辑汇编文件添加一个XAML开关

#if NUGET_ENABLE 
[assembly: XmlnsDefinition("nuget_enable", "NameSpace")]
#endif // NUGET_ENABLE

Step3b:添加XAML文件头

    ...
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     xmlns:nuget="http://schemas.nugetPackage2Exclude.etc/"
     xmlns:nugetEnabled="nuget_enable"
    ...
     mc:Ignorable="d nuget" // d is optional!
    ...

Step3c:添加XAML上下文切换

    <mc:AlternateContent>
        <mc:Choice Requires="nugetEnabled">
                <!--<code calling the nuget>-->
        </mc:Choice>
        <mc:Fallback>
        
        </mc:Fallback>
    </mc:AlternateContent>

Step4:编译开关隔离C#文件中的包

#if NUGET_ENABLE 
// Code
#endif