Мой ответ состоит из двух частей.
Во-первых, если вы используете dotnet pack
или msbuild -t:pack
без файла nuspec, тогда ссылки на проекты автоматически становятся зависимостями nuget.Я проверил это с помощью следующих команд:
dotnet new classlib -n ProjectA
dotnet new classlib -n ProjectB
dotnet add ProjectB/ProjectB.csproj reference ProjectA/ProjectA.csproj
dotnet pack ProjectB/ProjectB.csproj
ProjectB.1.0.0.nupkg
имеет зависимость nuget от ProjectA v1.0.0
.Это работает "из коробки" с проектами в стиле SDK, но если у вас есть проект "старого стиля" (который импортирует Microsoft.CSharp.targets), вам нужно добавить ссылку на пакет в NuGet.Build.Tasks.Pack,Если вы используете PackageReference, вам может потребоваться отредактировать ваш csproj и установить эту зависимость, чтобы установить PrivateAssets для всех, чтобы этот пакет не становился зависимостью nuget.Я не знаю, что эквивалентно, если вы используете package.config, или если это вообще возможно.Если вы используете msbuild или dotnet pack, но у вас также есть свой собственный файл nuspec, я рекомендую против этого.Все, что вы хотите сделать в nuspec, должно быть возможным путем установки правильных свойств или атрибутов элементов в вашем csproj, и позволить целям пакета автоматически генерировать nuspec.Когда у вас есть собственный nuspec, части автогенерации nuget отключаются, поэтому вам может быть все сложнее для себя.
Моя память о nuget pack
в файлах csproj старого стиля такова, что nuget автоматическипроект ссылается на зависимость nuget, если у указанного проекта есть файл <project name>.nuspec
в том же каталоге, что и файл <project name>.csproj
(я почти уверен, что он задокументирован где-то на docs.microsoft.com/nuget).Однако, если ваш зависимый проект представляет собой проект в стиле SDK (как это необходимо для проектов .NET Core или .NET Standard), тогда я уже советовал не использовать файл nuspec с этими проектами, поэтому вам следует рассмотреть возможность использования целей пакета и прекратить работу.использование nuget pack
.
Во второй части моего ответа будет дан прямой ответ на ваш вопрос о том, как сделать ссылку на проект ссылкой на пакет в определенных сборках.Во-первых, вам нужно использовать цели пакета либо с помощью проекта в стиле SDK, либо с помощью ссылки на пакет NuGet.Build.Tasks.Pack.Таким образом, вы не используете файл nuspec
, и все определено в вашем csproj
, который является просто файлом MSBuild.В MSBuild есть условия, поэтому отредактируйте вручную ваш csproj и сделайте так, чтобы ссылка на проект имела определенное условие, а ссылка на пакет - на противоположное условие.Я предлагаю использовать такую переменную, как $ (CI), чтобы вы могли протестировать пакет, используя msbuild -t:pack -p:CI=true
, и на своей машине CI просто установите для CI в качестве переменной среды значение true.Поскольку в NuGet уже есть встроенная функциональность для преобразования ссылок проекта в зависимости nuget, я рекомендую использовать это, а не переключаться между ссылками на пакеты и проекты, поэтому я не собираюсь приводить пример копирования-вставки, как это сделать.Но если это не проблема XY и вам действительно нужно это сделать, то я уже дал достаточно указателей, чтобы вы могли понять, как делать все остальное.