【问题标题】:Excluding classes from Nuget package从 Nuget 包中排除类
【发布时间】:2021-11-18 07:05:39
【问题描述】:

更新说明:

我有一个作为 Nuget 包公开的项目。我需要它对我的解决方案程序集公开,但对将使用我的包的人来说是私有的。有没有办法做到这一点?

原问题:

我正在进行的一个项目目前正在使用 2 个实体项目,并且它是通过 .Net Standard 2.0 框架编写的:

Contract.csproj
Contract.Internal.csproj

第一个配置为使用私有 Nuget 服务器向消费者公开,而第二个用于我的解决方案项目的内部使用
问题是两者都有几乎相同的类,除了少数仅供我的解决方案内部使用。

有没有办法将它们合并到一个项目中,并配置一些类在 NuGet 包中公开而其他类不公开?

我阅读了可以添加到 csproj PackageReference 的 ExcludeAssets/IncludeAssets 标记,但 docs 和我看到的所有示例都引用依赖项及其版本,而不是项目类。

另外,如果您有其他解决方案,您可以以其他方式处理您的项目(或者甚至认为我发现自己的这种情况是错误的)如果您分享您对此的想法,我会非常高兴.

【问题讨论】:

  • 为什么不only 在 Contract.Internal 中拥有供内部使用的类,并让您的内部工具引用这两个程序集?

标签: c# class nuget-package .net-standard-2.0 exclude


【解决方案1】:

如果您想在项目中公开某些类,同时将其他类保留在内部,您可以使用C# access modifiers

例如,以internal 为前缀的类将仅在您的项目中可见:

internal class Foo { }

public 为前缀的类将可供其他人访问:

public class Bar { }

【讨论】:

  • 将其标记为内部不会解决我的问题,因为它将对我的其他解决方案程序集隐藏。正如我在我的问题中所说,我需要它们对我的程序集公开,但对任何将使用我的包的人都是私有的。
【解决方案2】:

我认为Wouter's 的回答应该有助于解决您的问题。但我想强调另一种解决类似问题的方法,它可能会在未来帮助您或其他人。

由于Contract.Internal.csproj 中有一个接口/功能,它是内部的,但在Contract.csproj 中是必需的,作为一种可能的解决方案,您可以使用 内部修饰符。为了访问Contract.csproj 中的内部接口,您可以使用这个answer

您需要做的是,通过以下方式修改Contract.Internal.csprojAssemblyInfo.cs 文件,授予Contract.csproj 的内部可见性访问权限:

[assembly: InternalsVisibleTo("Contract.Internal")]

【讨论】:

    【解决方案3】:

    单个包在这里是错误的方法,因为它违反了关注点分离的原则。相反,您应该拥有拥有所有公共代码并可供任何人使用的MyPackage,然后为您自己的内部使用拥有引用MyPackageMyPackage.Private。你的用户引用MyPackage,你引用MyPackage.Private,一切都很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-18
      • 2023-03-14
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多