Исключение классов из пакета 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
см .: Наследование - производные типы для создания более специализированного поведения