Ответ 1
Немного поздно, но позвольте мне попытаться объяснить, почему я не хочу, чтобы сборники связанных ссылок были упакованы в пакет ввода по умолчанию.
Инфраструктура .NET Core предназначена для модульной работы и основана на модели пакетов. В основном,.NET Core SDK и dotnet-мультиплексор (основной загрузочный сервер .NET и хост-процесс) работают сначала с пакетами и их метаданными, а не с dll, которые являются основными CLR, которые напрямую связаны с ними. Таким образом, в .NET Core на самом высоком уровне идентификатор пакета/версия является первичной, а имя/версия dll внутри пакета является вторичной.
Сам пакет (несмотря на то, что он является архивом с некоторым контентом) - это абстракция, которая идентифицируется по имени и версии.
Предположим, что мы имели желаемое поведение dotnet pack
, и все ссылки упакованы в один и тот же пакет ввода.
Теперь, если у нас есть цепочка ссылок на проекты, мы получаем единый пакет со всеми DLL внутри. Вероятно, он подходит для наших нужд, но он также нарушает:
- Модульная идея .NET Core (поскольку мы должны думать о DLL, скорее чем абстрактный пакет, который является только идентификатором/версией - это добавит много путаницы и сложности, поскольку нам также понадобится возможность не иметь пакет "все-в-одном", избегать дублирования DLL, обрабатывать разрешение DLL в случае множественного версии и т.д.).
- SRP (когда некоторые из требуемые DLL необходимо перестроить, нам нужно будет обновить весь пакет).
Что касается вопроса, я думаю, что возможный способ добиться этого - использовать пользовательский файл .nuspec
, где вы можете указать DLL, которые хотите упаковать.
<PropertyGroup>
<NuspecFile>App.nuspec</NuspecFile>
</PropertyGroup>
После этого dotnet pack
создаст пакет по отношению к MyPackage.nuspec
.
Кроме того, если у вас есть 3 проекта с контрактами и реализациями, и вы не хотите добавлять 3 ссылки на пакеты, вы можете создать пакет, который просто имеет эти 3 в качестве зависимостей и ссылается на один пакет.
Чтобы обернуть все, текущая модель Package-per-Project довольно проста и по-прежнему остается гибкой для пользовательских прецедентов.