如何 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)
涉及的步骤!
- 编译开关声明
- compiling/ignoring Nuget 包
的预构建条件开关
- XAML 文件中的上下文切换。
- 编译开关以隔离 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
我在项目中使用了 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)
涉及的步骤!
- 编译开关声明
- compiling/ignoring Nuget 包 的预构建条件开关
- XAML 文件中的上下文切换。
- 编译开关以隔离 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