У меня есть решение, созданное в.NET 6.0 с использованием Visual Studio 2022, в котором много проектов.
Каждый проект имеет столько ссылок на пакеты nuget в файле.csproj, как показано ниже.
Можно ли управлять всеми пакетами nuget в одном месте/глобально в решении (а не для каждого проекта)?
Это гарантирует, что все проекты в решении используют одну и ту же версию пакета (больше не будет конфликтов версий между проектами для одного и того же пакета nuget).
Однократное обновление пакета в центральном расположении гарантирует, что все проекты будут ссылаться на одну и ту же обновленную версию. Нет необходимости обновлять пакет для каждого проекта.
Спасибо за вашу помощь.
<ItemGroup>
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="10.0.1" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.20.0" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="2.0.2" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes.HostingStartup" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="6.0.1" />
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="5.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="6.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.14.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.1" />
<PackageReference Include="System.Collections" Version="4.3.0" />
<PackageReference Include="System.Runtime" Version="4.3.1" />
</ItemGroup>
Решение проблемы
Есть несколько подходов к этому, хотя ни один из них не идеален.
Вручную с помощью файла.targets
Имейте файл.targets со всеми пакетами, на которые вы ссылаетесь, но используйте <PackageReference Update=вместо Include=. Включите это в свой файл Directory.Build.targets, чтобы оно применялось в конце каждого файла проекта.
Самым большим недостатком этого является то, что каждый раз, когда в какой-либо проект добавляется новый PackageReference, вам нужно также помнить об обновлении файла.targets, чтобы включить в него запись для обновления этой версии пакета.
Это гарантирует, что все ваши <PackageReference>записи будут объединены в одни и те же версии. Однако это не влияет на транзитивные ссылки, т. е. если у вас есть Project1 -> Package1 -> Package2, но имеется только PackageReference для Package1, вы не сможете повлиять на указанную версию Package2. Это может привести к конфликтам, если Project2 -> Package2 версии, отличной от той, на которую ссылается Package1.
Используйте центральные версии пакетов MSBuild SDK (CPV)
Ручной процесс может быть подвержен ошибкам, поэтому существует SDK, который поможет сделать этот процесс более плавным. Вы можете найти его в Central Package Versions. Это также гарантирует, что пользователи не будут указывать версию в проекте (поскольку вместо этого они должны использовать центральную версию!), поэтому это будет более последовательно, чем использование ручного метода.
Это также никоим образом не решает проблемы транзитивной зависимости.
Используйте управление версиями пакетов Nuget Central (CPVM)
Это решение команды NuGet (в процессе) для этой проблемы. Вы можете найти документацию по адресу Централизованное управление версиями пакетов NuGet. Эта функция все еще находится в стадии предварительного просмотра, основные функции кажутся довольно надежными, но могут измениться в будущем по мере доработки дизайна.
Имейте файл с именем Directory.Packages.props в своей корневой папке и включите эту функцию (требуется согласие, поскольку она все еще находится в предварительной версии), добавив:
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
Теперь, как и в случае с CPV SDK, вы должны удалить все версии из <PackageReference>элементов и поместить их в <PackageVersion>элементы в ваших файлах Directory.Packages.props. Если вам нужно переопределить версию, вы можете сделать это в.csproj с помощью <PackageVersion Update="PackageName" Version="DifferentVersion" />(это связано с тем, что Directory.Packages.props импортируется через файл.NET SDK.props, который находится до оценки содержимого.csproj).
Это также в настоящее время ничего не помогает с транзитивными ссылками, но эта функция разрабатывается (есть несколько вопросов, открытых для таких обсуждений, но вы можете следить за https://github.com/NuGet/Home/pull/11391 в качестве пример).
Но как насчет транзитивной проблемы?
Решение транзитивных конфликтов в каждом случае, к сожалению, представляется ручным вмешательством путем превращения транзитивной зависимости в первичную, т. е. в предыдущем примере с Project1 добавление PackageReference к Package2 в.csproj закрепит версию, используя любой из выше методы, которые вы выбрали. (Транзитивное закрепление, предложенное для CPVM, состоит в том, чтобы просто выполнять это «продвижение» автоматически.)
Это может быть утомительным процессом, выполняемым вручную, но если у вас есть глобально применимые пакеты, они могут быть несколько централизованы либо с помощью GlobalPackageReference CPV, либо путем помещения PackageReference в общий файл.props или.targets для двух других методов.
Комментариев нет:
Отправить комментарий