Обновление пакетов Nuget во многих проектах / решениях - PullRequest
0 голосов
/ 20 июня 2019

Если вы используете один и тот же пакет (ы) nuget для нескольких решений, как мне поддерживать их актуальность без необходимости открывать каждое решение и обновлять пакеты при выпуске новой версии?

Структура папок, как правило, примерно такая, но для многих других проектов. Каждый проект имеет свой собственный packages.config с различными ссылками на пакеты.

$tfs/
├── Solution One/
│   ├ Solution 1.sln
│   ├   nuget.config (solution item)
│   ├── Packages/
│   ├    ├── Newtonsoft.JSON.12.0.2/
│   ├    ├── Jquery3.1.4/
│   ├── Project one/
│   ├       ── packages.config
│   ├       ── whatever.cs
│   ├       ── folder /
│   ├       ── another folder /
│   ├── Project Two/
│   ├       ── packages.config
│   ├       ── file.cs
│   ├       ── folder/
│   ├       ── another folder/
├── Solution Two/
│   ├ Solution 2.sln
│   ├   nuget.config
│   ├── Packages/
│   ├    ├── Newtonsoft.JSON.11.1.0/
│   ├    ├── Jquery1.3.4/
│   ├── Project one/
│   ├       ── packages.config
│   ├       ── whatever.cs
│   ├       ── folder /
│   ├       ── another folder /
│   ├── Project two/
│   ├       ── packages.config
│   ├       ── file.cs
│   ├       ── folder/
│   ├       ── another folder/

Я попытался запустить этот PowerShell в консоли диспетчера пакетов, но это относится только к одному решению за раз:

$packageId = "jquery"
Get-ChildItem *.sln -recurse | %{.\\nuget.exe restore $_.fullname}
Get-ChildItem packages.config -Recurse `
| Where-Object {$_ | Select-String -Pattern $packageId} `
| %{.\\nuget.exe update -Id $packageId $_.FullName}

Нужно ли обновлять packages.config в каждом решении каждого проекта и открывать их для получения обновлений? Я бы подумал, что будет более простой способ сделать это. Я использую частный сервер Nuget, если это имеет значение.

Примечание: я смотрел на этот вопрос: Обновление пакетов nuget во всех проектах в решении , и это не тот же сценарий, что и у меня. Я хочу обновить пакеты для нескольких решений, а не для нескольких проектов в одном решении.

1 Ответ

1 голос
/ 24 июня 2019

Как сказал @imps в комментариях, нет решения для packages.config проектов в разных решениях. В рамках решения вы можете использовать пользовательский интерфейс NuGet Package Manager «Управление пакетами для решения», а вкладка «Консолидация» позволяет убедиться, что все проекты используют одну и ту же версию, но вам придется повторить это для всех решений.

Если вы мигрируете с packages.config на PackageReference, вы можете воспользоваться преимуществами расширяемости MSBuild и либо импортировать обычный файл props, либо, если используете Visual Studio 2017 или новее, использовать Directory.Build.Props в верхнем общем родительском каталоге всех проектов.

В вашем файле props вы определяете версии пакетов, которые вам нужны, примерно так:

<Project>
  <PropertyGroup>
    <NewtonsoftJsonVersion>12.0.1</NewtonsoftJsonVersion>
  </PropertyGroup>
</Project>

и затем в ваших csproj файлах используйте <PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />. Проблема заключается в том, что вы больше не можете использовать пользовательский интерфейс диспетчера пакетов или консоль диспетчера пакетов в VS (что ж, вы можете, но он изменит его в csproj, а не в вашем файле props), но вы все еще можете использовать пользовательский интерфейс для проверки обновлений. Если вы добавите файл props в свое решение, то для обновления потребуется всего два щелчка и несколько нажатий на клавиатуре, так что на самом деле это не имеет большого значения.

В вашем примере общим родительским каталогом будет корень TFS, поэтому $/Directory.Build.props. Проблема заключается в том, что если вы используете CI и у вас есть триггер для запуска сборки решения One на изменениях $/Solution One/* и запускаете сборку решения два на изменениях $/Solution Two/*, тогда они оба пропустят изменения на $/Directory.Build.props. Или, возможно, можно настроить триггеры сборки TFS, чтобы включить его, но я не помню, потому что я не использовал TFVC так долго.

Однако большая проблема в том, что в вашем примере ясно, что вы используете пакет jQuery. Используется content, который копирует файлы в ваш проект при установке / обновлении. PackageReference не работает таким образом (он указан как проблема совместимости пакетов ), поэтому, если вы не хотите использовать другой процесс для обновления jQuery и любых других js / css в своих веб-проектах, вы можете перенести проекты ASP.NET в PackageReference. Обратите внимание, что проекты ASP.NET Core имеют стиль SDK, который поддерживает только PackageReference, а не packages.config, и обычно использует LibMan или npm для получения css и javascript.

Клиенты, которые могут перейти на проекты в стиле SDK, могут даже подумать об использовании этого SDK для централизованного управления пакетами , что поможет вам не случайно оставить номер версии в csproj.

...