Отримайте інформацію про ліцензії для всіх використаних пакетів NuGet


26

Щоб підтримувати наш будинок в порядку, я хочу автоматично збирати ліцензії на залежність від проекту в нашій документації, а не додавати їх вручну.

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


Коли ви говорите інформацію про ліцензію, ви маєте на увазі коротку рядок, що представляє тип ліцензії або посилання, що вказує на сторінку ліцензії в Інтернеті? Як ви хочете, щоб ця інформація була повернута у вікні консолі або, наприклад, у файлі CSV / HTML?
mguassa

Я міг би взяти або посилання, або рядок. Я більше шукаю програмного способу доступу до інформації, в першу чергу
Байрон Росс,

Відповіді:


25

Один із способів я знати, як отримати таку інформацію, - це використовувати PowerShell в консолі диспетчера пакетів з Visual Studio .

Консоль Package Manager - це консоль PowerShell у Visual Studio, яка використовується для взаємодії з NuGet та автоматизації Visual Studio.

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

Ось приклад рішення Рішення шахти, що повертає список записів, кожна з яких складається з ідентифікатора пакета та посилання на ліцензію:

Get-Package | Select-Object Id,LicenseUrl

Вихід виглядає приблизно так:

вихід-пакет вихід

Інші елементи, які можна повернути, задокументовані у посиланні на Nuspec , у розділі метаданих (наприклад, версія пакету, короткий опис тощо).


Лише зауваження - у VS2015 'LicenseUrl' завжди повертає порожній рядок. У документації NuGet сказано, що "LicenseUrl" буде застарілим з v3.x на підопічних, але не згадує жодних альтернатив
James Poulose

Станом на 4/24 через VS2017 ця відповідь працює.
justSteve

8

На основі декількох джерел я створив скрипт PowerShell, який читає всі пакети NuGet і витягує файли ліцензій і поміщає їх у папку під назвою "ліцензії". Сценарій повинен запускатися в корені проекту (де знаходиться папка "пакети").

# 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.


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"}}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.