Erhalten Sie Lizenzinformationen für alle verwendeten NuGet-Pakete

26

Um unser Haus in Ordnung zu halten, möchte ich Lizenzen für Projektabhängigkeiten in unserer Dokumentation automatisch zusammenstellen, anstatt sie manuell hinzufügen zu müssen.

Kennt jemand eine einfache Möglichkeit, einen Satz von CSPROJ-Dateien programmgesteuert zu durchlaufen und die Lizenzinformationen für die angegebenen Pakete als Link oder Zeichenfolge zu extrahieren?

Byron Ross
quelle
Wenn Sie Lizenzinformationen sagen, meinen Sie eine kurze Zeichenfolge, die den Lizenztyp darstellt, oder einen Link, der auf die Lizenzseite im Web verweist? Wie möchten Sie, dass diese Informationen in einem Konsolenfenster oder beispielsweise in einer CSV / HTML-Datei zurückgegeben werden?
mguassa
Ich könnte entweder den Link oder eine Zeichenfolge nehmen. Ich bin eher auf der Suche nach einer programmgesteuerten Möglichkeit, auf die Informationen zuzugreifen
Byron Ross,

Antworten:

25

Eine Möglichkeit, solche Informationen abzurufen, ist die Verwendung von PowerShell in der Package Manager-Konsole in Visual Studio .

Die Package Manager-Konsole ist eine PowerShell-Konsole in Visual Studio, die zur Interaktion mit NuGet und zur Automatisierung von Visual Studio verwendet wird.

Grundsätzlich können Sie das Cmdlet Get-Package verwenden , um eine Liste der Pakete abzurufen, auf die in einem bestimmten Projekt (oder in einer gesamten Lösung) verwiesen wird. In Bezug auf die Lizenzinformationen für jedes Paket können Sie für das, was ich gesehen habe, nur die Lizenz-URL erhalten und nicht nur eine kurze Zeichenfolge, die den Lizenztyp darstellt.

Hier ist ein Beispiel für eine Lösung von mir, die eine Liste von Einträgen zurückgibt, die jeweils aus der Paketkennung und dem Link zur Lizenz besteht:

Get-Package | Select-Object Id,LicenseUrl

Die Ausgabe sieht ungefähr so ​​aus:

get-package output

Weitere Elemente, die zurückgegeben werden können, sind in der Nuspec-Referenz im Abschnitt mit den Metadaten dokumentiert (z. B. die Version des Pakets, eine kurze Beschreibung usw.).

mguassa
quelle
Nur eine Anmerkung - In VS2015 gibt 'LicenseUrl' immer eine leere Zeichenfolge zurück. Die NuGet-Dokumentation besagt, dass 'LicenseUrl' auf den Stationen von Version 3.x nicht mehr unterstützt wird, erwähnt jedoch keine Alternativen
James Poulose,
Ab 4/24 via VS2017 funktioniert diese Antwort.
JustSteve
8

Basierend auf mehreren Quellen habe ich ein PowerShell-Skript erstellt, das alle NuGet-Pakete liest, die Lizenzdateien abruft und in einem Ordner namens "Lizenzen" ablegt. Das Skript sollte im Stammverzeichnis des Projekts ausgeführt werden (in dem sich der Ordner "packages" befindet).

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

Haftungsausschluss: Ich bin kein PowerShell-Experte. Laufen Sie auf eigenes Risiko :)

Ich konnte keinen einfachen Code finden, der anhand der Lizenzdatei erkennt, über welche Lizenz das NuGet-Paket verfügt. Das einzige Projekt, das einer Lösung nahe kommt, ist der Lizenznehmer . Dieses Projekt wurde jedoch in Ruby erstellt.

Jerone
quelle
0

Ich konnte die Lizenzinformationen mit dem folgenden Befehl abrufen:

@( @(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"}}
stämmiger Bogdan
quelle