从 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.csproj
的 AssemblyInfo.cs
文件,授予 Contract.csproj
内部可见性的访问权限:
[assembly: InternalsVisibleTo("Contract.Internal")]
单个包在这里是错误的方法,因为它违反了关注点分离原则。相反,您应该拥有 MyPackage
,其中包含所有 public 代码,并且旨在供任何人使用,然后为了您自己的内部使用,拥有引用 MyPackage
的 MyPackage.Private
。你的用户引用 MyPackage
,你引用 MyPackage.Private
,一切都很简单。
更新说明:
我有一个公开为 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.csproj
的 AssemblyInfo.cs
文件,授予 Contract.csproj
内部可见性的访问权限:
[assembly: InternalsVisibleTo("Contract.Internal")]
单个包在这里是错误的方法,因为它违反了关注点分离原则。相反,您应该拥有 MyPackage
,其中包含所有 public 代码,并且旨在供任何人使用,然后为了您自己的内部使用,拥有引用 MyPackage
的 MyPackage.Private
。你的用户引用 MyPackage
,你引用 MyPackage.Private
,一切都很简单。