从 Nuget 包中排除 类

Excluding classes from Nuget package

更新说明:

我有一个公开为 Nuget 包的项目。我需要它对我的解决方案程序集是 public 但对使用我的包的人来说是私有的。有办法实现吗?

原题:

我正在处理的一个项目目前正在使用 2 个实体项目,它是在 .Net Standard 2.0 框架上编写的:

Contract.csproj
Contract.Internal.csproj

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

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

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

此外,如果您有其他解决方案,您可以通过其他方式处理您的项目(或者甚至认为我发现自己在那种情况下是错误的)如果您分享您的想法,我将非常高兴关于这个。

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

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

internal class Foo { }

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

public class Bar { }

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

由于 Contract.Internal.csproj 中有一个 interface/functionality 是内部的但在 Contract.csproj 中需要,作为一个可能的解决方案,而不是制作它的接口 public,你可以用 internal 修饰符来限制它。为了访问 Contract.csproj 中的内部接口,您可以使用 answer.

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

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

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