Как упаковать ссылочный проект в пакет nuget? - PullRequest
1 голос
/ 06 января 2020

У меня есть C# решение, которое содержит 3 проекта; Application.Server, Application.Client и Application.Common. И сервер, и клиент имеют общую ссылку на проект.

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

Есть ли способ заставить их встроить этот проект в себя? В идеале я не хочу публиковать sh общий пакет, так как он довольно точно указывает c для моего приложения, и на самом деле не имеет смысла, что это то, что независимо потребляется другими отделами. Я также не хочу беспокоиться о том, чтобы спорить с дополнительными пакетами nuget, если я могу помочь (как на самом деле, Common - это на самом деле несколько проектов).

1 Ответ

1 голос
/ 06 января 2020

Если ваши проекты "старого стиля" / не SDK / традиционного csproj, AND , если какой-либо проект использует пакет NuGet, если все эти ссылки NuGet определены с использованием packages.config, тогда использовать вы можете используйте nuget.exe pack -IncludeReferencedProjects. Однако если какой-либо из ваших проектов использует PackageReference для определения ссылок на свои пакеты (новые проекты в стиле SDK могут использовать только PackageReference), то nuget.exe pack не будет правильно создавать зависимости NuGet для этих пакетов. Для проектов с многоцелевым таргетингом в стиле SDK nuget pack, вероятно, полностью потерпит неудачу.

Единственный поддерживаемый способ упаковать проекты, использующие PackageReference или любой проект в стиле SDK, - это использовать цель пакета NuGet MSBuild (либо dotnet pack или msbuild -t:pack). Тем не менее, это не имеет эквивалента IncludeReferencedProjects.

для nuget.exe. Если ваши проекты выполнены в стиле SDK, создавать и публиковать их не должно быть более трудным sh один пакет или много пакетов. Просто запустите dotnet pack для своего решения, и каждый упаковываемый проект будет упакован (не забудьте пометить любой проект библиотеки классов, который вы не хотите, чтобы он был упакован как не упаковываемый). Затем используйте ваш любимый язык сценариев, чтобы найти и опубликовать sh все файлы nupkg. Например (Get-ChildItem -Recurse -Filter *.nupkg $SLN_DIR | ForEach-Object { & dotnet nuget push $_ }, или скопируйте / переместите все nupkgs в одно место (или используйте соответствующий параметр, чтобы NuGet создавал пакеты там в первую очередь) и используйте dotnet nuget push *.nupkg.

команда NuGet рекомендует один пакет на сборку, и инструмент автоматически создает зависимости NuGet для ссылок на проекты, поэтому все «просто работает» из коробки. Чтобы создать пакет со всеми включенными сборками, вместо зависимостей NuGet, требуется выполнить кучу работы.

...