Uzyskaj informacje o licencji dla wszystkich używanych pakietów NuGet

26

Aby utrzymać porządek w naszym domu, chcę automatycznie gromadzić licencje na zależności projektów w naszej dokumentacji, zamiast dodawać je ręcznie.

Czy ktoś zna prosty sposób na programowe przeglądanie zestawu plików CSPROJ i wyodrębnianie informacji o licencji dla odnośnych pakietów jako łącza lub łańcucha?

Byron Ross
źródło
Kiedy mówisz o informacjach o licencji, masz na myśli krótki ciąg reprezentujący typ licencji lub link prowadzący do strony z licencją w Internecie? Jak chcesz zwrócić te informacje w oknie konsoli lub na przykład w pliku CSV / HTML?
mguassa
Mogę wziąć link lub ciąg znaków. Bardziej szukam programowego sposobu na uzyskanie dostępu do informacji
Byron Ross

Odpowiedzi:

25

Jednym ze znanych mi sposobów uzyskania takich informacji jest użycie programu PowerShell w konsoli Menedżera pakietów z poziomu Visual Studio .

Konsola Menedżera pakietów to konsola PowerShell w programie Visual Studio służąca do interakcji z NuGet i automatyzacji programu Visual Studio.

Zasadniczo można użyć polecenia cmdlet Get-Package, aby uzyskać listę pakietów, do których istnieją odniesienia w określonym projekcie (lub w całym rozwiązaniu). Jeśli chodzi o informacje o licencji dla każdego pakietu, za to, co widziałem, możesz uzyskać tylko adres URL licencji, a nie tylko krótki ciąg reprezentujący typ licencji.

Oto przykład mojego rozwiązania zwracającego listę wpisów, z których każdy składa się z identyfikatora paczki i łącza do licencji:

Get-Package | Select-Object Id,LicenseUrl

Wynik jest mniej więcej taki:

get-pack

Inne elementy, które można zwrócić, są udokumentowane w odnośniku Nuspec , w sekcji metadanych (np. Wersja pakietu, krótki opis itp.).

mguassa
źródło
Tylko uwaga - w VS2015 „LicenseUrl” zawsze zwraca pusty ciąg. Dokumentacja NuGet mówi, że „LicenseUrl” zostanie wycofany z wersji 3.x na oddziałach, ale nie wspomina o żadnych alternatywach
James Poulose
Począwszy od 4/24 przez VS2017 ta odpowiedź działa.
justSteve
8

Na podstawie wielu źródeł stworzyłem skrypt PowerShell, który odczytuje wszystkie pakiety NuGet, pobiera pliki licencji i umieszcza je w folderze o nazwie „licencje”. Skrypt powinien zostać uruchomiony w katalogu głównym projektu (gdzie znajduje się folder „paczki”).

# 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)
    }
}

Oświadczenie: Nie jestem ekspertem od PowerShell. Uruchom na własne ryzyko :)

Nie mogłem znaleźć żadnego prostego kodu, który wykryłby, jaką licencję ma pakiet NuGet, na podstawie jego pliku licencji. Jedynym projektem zbliżonym do rozwiązania jest Licencjobiorca , ale jest on wbudowany w Ruby.

jerone
źródło
0

Udało mi się uzyskać informacje o licencji za pomocą następującego polecenia:

@( @(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"}}
krzepki bogdan
źródło