Как скрыть или ограничить загрузку пользователем только зависимого пакета из nuget?

#c# #.net #dependencies #nuget #nuget-package

#c# #.net #зависимости #nuget #nuget-пакет

Вопрос:

Проблема: у меня есть Project_A и Project_B. Project_B зависит от Project_A. Зависимость Project_B заполняется путем добавления Project_A в качестве ссылки на пакет nuget (Project_A публикуется как пакет nuget и включается в Project_B). Наконец, Project_B упаковывается как ссылка на nuget для конечных пользователей. Когда они загружают Project_B, который зависит от Project_A, конечный пользователь видит пакет Project_A nuget в nuget package explorer.

Цель:

  1. Могу ли я скрыть пакет Project_A nuget из nuget package Explorer? потому что, если конечный пользователь загружает это, тогда нет смысла публиковать как зависимость для пакета Project_B nuget.
  2. Могу ли я ограничить конечного пользователя в том, как загружать ссылку Project_A?

Ожидаемый результат: мое конечное использование должно иметь возможность загружать только ссылку Project_B, но не ссылку Project_A по отдельности. Ссылка на Project_A должна загружаться автоматически как зависимость для Project_B.

Фактический результат: моим конечным пользователям не нужно загружать ссылку на пакет Project_A nuget в свой проект.

Комментарии:

1. Каким образом загрузка пакета nuget от Project_A не требуется? Если Project_B зависит от него, если он не загружен, то проект не удастся запустить.

Ответ №1:

Тот факт, что два пакета NuGet создаются из проектов, на самом деле не имеет значения. В итоге у вас есть два пакета: Project_A и Project_B, а Project_B зависит от Project_A.

Могу ли я скрыть пакет Project_A nuget из nuget package Explorer?

nuget.org имеет концепцию незарегистрированных пакетов, поэтому пользователи не будут видеть их в результатах поиска. Но если вы публикуете свои пакеты в другом канале NuGet, это зависит от реализации сервера. Однако будьте осторожны, делая это, поскольку это может привести к неприятным последствиям для пользователей, если это вызовет проблемы с восстановлением пакета, не включенного в список.

Могу ли я ограничить конечного пользователя в том, как загружать ссылку Project_A?

Честно говоря, мой ответ: зачем вам это нужно? Какой вред, если разработчик загружает Package_A? Какую проблему вы пытаетесь решить, и есть ли другой способ решить ту же проблему? Представьте, что вы разработчик, который использует пакет, но его зависимость, похоже, отсутствует, что бы вы почувствовали?

Чтобы напрямую ответить на ваш вопрос, вы могли бы просто опубликовать пакет Project_A в частном канале nuget. Но в этом случае, если Package_B находится в общедоступном канале, то только люди, имеющие доступ к закрытому каналу, смогут его использовать, для всех остальных NuGet не сможет восстановить свою зависимость.

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

Комментарии:

1. Мой вариант использования: у меня есть два репозитория Repo_A и Repo_B. У Repo_A есть Project_A и Project_B, а у Repo_B есть Project_C . Project_B и Project_C — это пакеты nuget, в которых много бизнес-логики с меньшей разницей. У Project_A просто есть контракт (абстрактный класс с методами). Итак, Project_C из Repo_B использует пакет Project_A nuget в качестве ссылки для переопределения абстрактного метода, и то же самое относится к Project_B. Из-за двух разных репозиториев мне нужно использовать этот подход. Если это было одно репозиторий, то я включил Project_A в качестве ссылки на проект для Project_B. У вас есть лучший подход для этого случая использования?

2. Звучит неплохо, но вы не сказали, почему Project_A, пакет абстракций, должен быть скрыт от разработчика с помощью Project_B или Project_C. И Project_B, и Project_C нуждаются в Project_A во время выполнения, и есть большая вероятность, что любому проекту, использующему пакеты Project_B или Project_C, также потребуется пакет Project_A во время сборки. Я не вижу никаких преимуществ в скрытии или ограничении загрузки Project_A.

3. Согласен. Даже если загрузка явно бесполезна.