Получить информацию о лицензии для всех используемых пакетов NuGet

26

Чтобы сохранить наш дом в порядке, я хочу автоматически собирать лицензии для зависимостей проекта в нашей документации, а не добавлять их вручную.

Кто-нибудь знает простой способ программно пройти через набор файлов CSPROJ и извлечь информацию о лицензии для упомянутых пакетов в виде ссылки или строки?

Байрон Росс
источник
Когда вы говорите информацию о лицензии, вы имеете в виду короткую строку, представляющую тип лицензии, или ссылку, указывающую на страницу лицензии в Интернете? Как бы вы хотели, чтобы эта информация возвращалась в окне консоли или, например, в файле CSV / HTML?
mguassa
Я мог бы взять либо ссылку, либо строку. Я больше ищу программный способ доступа к информации в первую очередь
Байрон Росс

Ответы:

25

Я знаю, как получить такую ​​информацию, используя PowerShell в консоли диспетчера пакетов из Visual Studio .

Консоль диспетчера пакетов - это консоль PowerShell в Visual Studio, используемая для взаимодействия с NuGet и автоматизации Visual Studio.

В основном вы можете использовать командлет Get-Package, чтобы получить список пакетов, на которые есть ссылки в конкретном проекте (или во всем решении). Что касается информации о лицензии для каждого пакета, то, что я видел, вы можете получить только URL лицензии, а не просто короткую строку, представляющую тип лицензии.

Вот пример моего решения, возвращающего список записей, каждая из которых состоит из идентификатора пакета и ссылки на лицензию:

Get-Package | Select-Object Id,LicenseUrl

Вывод примерно такой:

вывод get-пакета

Другие элементы, которые могут быть возвращены, описаны в справочнике Nuspec , в разделе метаданных (например, версия пакета, краткое описание и т. Д.).

mguassa
источник
Просто примечание - в VS2015 'LicenseUrl' всегда возвращает пустую строку. Документация NuGet гласит, что LicenseUrl будет устаревшим с v3.x для подопечных, но Бут не упоминает ни о каких альтернативах
Джеймс Поулос
По состоянию на 4/24 через VS2017 этот ответ работает.
JustSteve
8

Основываясь на нескольких источниках, я создал сценарий PowerShell, который читает все пакеты NuGet, извлекает файлы лицензий и помещает их в папку, называемую «лицензии». Скрипт должен быть запущен в корне проекта (там, где находится папка «packages»).

# Run in Package Manager Console with `./download-packages-license.ps1`.
# If access denied, execute `Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned`.

Split-Path -parent $dte.Solution.FileName | cd; New-Item -ItemType Directory -Force -Path ".\licenses";
@( Get-Project -All | ? { $_.ProjectName } | % {
    Get-Package -ProjectName $_.ProjectName | ? { $_.LicenseUrl }
} ) | Sort-Object Id -Unique | % {
    $pkg = $_;
    Try {
        if ($pkg.Id -notlike 'microsoft*' -and $pkg.LicenseUrl.StartsWith('http')) {
            Write-Host ("Download license for package " + $pkg.Id + " from " + $pkg.LicenseUrl);
            #Write-Host (ConvertTo-Json ($pkg));

            $licenseUrl = $pkg.LicenseUrl
            if ($licenseUrl.contains('github.com')) {
                $licenseUrl = $licenseUrl.replace("/blob/", "/raw/")
            }

            $extension = ".txt"
            if ($licenseUrl.EndsWith(".md")) {
                $extension = ".md"
            }

            (New-Object System.Net.WebClient).DownloadFile($licenseUrl, (Join-Path (pwd) 'licenses\') + $pkg.Id + $extension);
        }
    }
    Catch [system.exception] {
        Write-Host ("Could not download license for " + $pkg.Id)
    }
}

Отказ от ответственности: я не эксперт PowerShell. Беги на свой страх и риск :)

Я не смог найти ни одного простого кода, который бы определял, какая лицензия у пакета NuGet, на основании его файла лицензии. Единственный проект, который приближается к решению, - это Лицензиат , но это сборка в Ruby.

jerone
источник
0

Мне удалось получить информацию о лицензии с помощью следующей команды:

@( @(Get-Project -All | ForEach-Object { Get-Package -ProjectName $_.ProjectName }) | Select Id -Unique ) | ForEach-Object { $pkg = $_ ;$pkgId = $_.Id ; if ($pkgId -notlike  'microsoft*'){ $url = Open-PackagePage $pkgId -License -WhatIf -PassThru; Write-Host "$pkgId $url"}}
крепкий богдан
источник