Исключение классов из пакета Nuget

В проекте, над которым я работаю, в настоящее время используются проекты с двумя объектами, и он написан на платформе .Net Standard 2.0:

Contract.csproj
Contract.Internal.csproj

Первый настроен для предоставления пользователям, использующим частный сервер Nuget, а второй предназначен для внутреннего использования моих проектов решений.
Дело в том, что оба имеют почти одинаковые классы, за исключением нескольких, предназначенных только для внутреннего использования в моем решении.

Есть ли способ объединить их в один проект и настроить некоторые классы, которые будут отображаться в пакете NuGet, а другие - нет?

Я читал о тегах ExcludeAssets / IncludeAssets, которые можно добавить в csproj PackageReference, но документы и все примеры, которые я видел, относятся к зависимостям и их версиям, а не к классам проекта.

Кроме того, если у вас есть другое решение, вы работаете со своими проектами по-другому (или даже думаете, что я ошибаюсь в этом сценарии). Я буду более чем счастлив, если вы поделитесь своими мыслями по этому поводу.

4 ответа

Если вы хотите предоставить определенные классы из своего проекта, оставив при этом другие классы внутренними, вы можете использовать модификаторы доступа C# .

Например, класс с префиксом internal будут видны только внутри вашего проекта:

      internal class Foo { }

Класс с префиксом public будут доступны для других:

      public class Bar { }

Один пакет - это неправильный подход, поскольку он нарушает принцип разделения ответственности. Вместо этого у вас должен быть весь общедоступный код, предназначенный для использования кем угодно, а затем для вашего внутреннего использования иметь эти ссылки. Ссылка ваших пользователей MyPackageвы ссылаетесь MyPackage.Private, и все просто.

Я думаю, ответ Wouter de Kort должен помочь решить вашу проблему. Но я хочу выделить другой подход к подобной проблеме, который может помочь вам или другим людям в будущем.

Поскольку в нем есть интерфейс / функциональность, которые являются внутренними, но необходимы в качестве возможного решения, вместо того, чтобы делать его интерфейс общедоступным, вы можете ограничить его с помощью внутреннего модификатора. И чтобы получить доступ к этому внутреннему интерфейсу, вы можете использовать этот ответ .

Что вам нужно сделать, так это предоставить доступ к внутренней видимости для Contract.csproj путем изменения AssemblyInfo.cs файл Contract.Internal.csproj следующим образом:

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

Сделай свой проект Contract.Internal.csproj унаследовать функциональность, предоставленную в Contract.csproj

см .: Наследование - производные типы для создания более специализированного поведения

Другие вопросы по тегам