Получить список всех пакетов NuGet, используемых в решении - PullRequest
0 голосов
/ 22 ноября 2018

Я ищу способ получения списка всех используемых пакетов NuGet в каждом проекте в решении (и, в частности, в версии), используя сценарий командной строки, а не вручную в Visual Studio.

ИспользованиеКонсоль диспетчера пакетов с командой «Get-Package» дает мне то, что я хочу, но она недоступна вне VS.

Я использую локальный канал NuGet.Мой формат управления пакетами по умолчанию - PackageReference.

Любая идея будет полезна

Ответы [ 5 ]

0 голосов
/ 19 июля 2019

Поскольку зависимости пакетов были перемещены в файл package.config, вот обновленная версия Powershell, предоставленная https://stackoverflow.com/users/2385218/sellotape

Get-Content .\NP.sln | where { $_ -match "Project.+, ""(.+)\\([^\\]+).csproj"", " } | foreach { "$($matches[1])\packages.config" } | % { Get-Content $_ | Find "<package id" } | Sort-Object -Unique

Вывод будет таким:

<package id="AutoMapper" version="8.1.1" targetFramework="net47" />
<package id="BouncyCastle" version="1.8.5" targetFramework="net47" />
<package id="CsvHelper" version="12.1.2" targetFramework="net47" />
<package id="DnsClient" version="1.2.0" targetFramework="net47" />
<package id="EntityFramework" version="6.2.0" targetFramework="net462" />
<package id="EntityFramework" version="6.2.0" targetFramework="net47" />
0 голосов
/ 05 марта 2019

Я написал сценарий C # для этой цели, но он не использует файл SLN напрямую.Вместо этого он ищет в данном каталоге любой файл packages.config.Дубликаты будут видны в столбце «сборки» (список всех сборок, которые используют указанный пакет).Выходными данными будет файл CSV для любого заданного местоположения.

Вы можете просто скопировать / загрузить или настроить код здесь: Исходный код

Вы также можете скомпилироватьприведенный выше исходный код с использованием CMD / Powershell: Компиляция / выполнение исходного файла C # в командной строке

0 голосов
/ 25 ноября 2018

PackageReference как формат управления пакетами работает только для каждого проекта.Таким образом, вам нужно будет «проанализировать» каждый проект в отдельности.

Из командной строки "будет" способ перечислить все пакеты.Это команда «пакетный список точек».Я говорю, будет, потому что это все еще в предварительном просмотре.Вы можете скачать версию 2.2.100 с здесь .Связанные spec .

Простейший пример использования:

dotnet list package YourSln.sln

Если вы не хотите использовать предварительный просмотр dotnet.exe, вы можете написать собственный инструмент, читая файлы ресурсов для каждого проекта, что и делает фактическая команда.Для справки см. Код здесь и здесь

0 голосов
/ 28 ноября 2018

Написание сценария, который находит вхождения тега PackageReference в каждом из файлов csproj, - отличная идея, предложенная selotape.

Это решение не будет работать, если в вашем файле csproj есть что-то вродеэто:

<PackageReference Include"SomePackage">
    <Version>1.0.42</Version>
</PackageReference>

Несмотря на то, что я рекомендую изменить формат для указания версии в строке (как в формате .NET Standard csproj), возможно, у вас нет времени сделать это для всехваши проекты.

Решение:

Используя скрипт C #, вы можете получить все элементы в ваших файлах csproj, содержащие PackageReference, в качестве их tag-name.Тогда вы можете сделать одну из двух вещей:

  1. Продолжать удаление текста, пока не найдете (для каждого элемента) регулярное выражение, подобное этому: (Version="*"), которое позволит вам найти версию для каждого PackageReference
  2. Сериализуйте элементы в ваш любимый формат (работает JSON), чтобы разделить данные в словаре, где вы можете просто получить имя и версию, вместе с любыми другими данными, которые вам могут понадобиться.

Надеюсь, это поможет.

0 голосов
/ 22 ноября 2018

Я уверен, что есть лучшие способы сделать это, но вот обходной способ PowerShell при использовании PackageReferences:

Get-Content .\<solution>.sln | where { $_ -match "Project.+, ""(.+)""," } | foreach { $matches[1] } | % {Get-Content $_ | Find "<PackageReference Include" } | Sort-Object -Unique

Запустите его в папке, где находится .slnжизни .

Он производит вывод примерно так:

<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.5.0" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Http" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="2.1.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.5" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
<PackageReference Include="StyleCop.Analyzers" Version="1.0.2">

Я намеренно удаляю дубликаты;Вы можете пропустить эту часть, если хотите.

В моем случае это соответствует выводу Get-Package с единственным исключением Microsoft.NETCore.App, поскольку оно нигде не указано в качестве зависимости, но, скорее всего, скорееполучено из <TargetFramework>netcoreapp2.1</TargetFramework>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...