Ottieni informazioni sulla licenza per tutti i pacchetti NuGet usati


26

Per mantenere la nostra casa in ordine, voglio assemblare automaticamente le licenze per le dipendenze del progetto nella nostra documentazione, piuttosto che doverle aggiungere manualmente.

Qualcuno conosce un modo semplice per attraversare a livello di programmazione una serie di file CSPROJ ed estrarre le informazioni sulla licenza per i pacchetti referenziati come link o stringa?


Quando dici informazioni sulla licenza intendi una breve stringa che rappresenta il tipo di licenza o un link che punta alla pagina della licenza sul web? Come desideri che queste informazioni vengano restituite, in una finestra della console o, ad esempio, in un file CSV / HTML?
mguassa,

Potrei prendere il collegamento o una stringa. Sono più alla ricerca di un modo programmatico per accedere alle informazioni in primo luogo
Byron Ross,

Risposte:


25

Un modo che conosco per ottenere tali informazioni è usando PowerShell nella console di Package Manager , da Visual Studio .

La console di Package Manager è una console di PowerShell in Visual Studio utilizzata per interagire con NuGet e automatizzare Visual Studio.

Fondamentalmente è possibile utilizzare il cmdlet Get-Package per ottenere un elenco di pacchetti a cui viene fatto riferimento in un progetto specifico (o in un'intera soluzione). Per quanto riguarda le informazioni sulla licenza per ciascun pacchetto, per quello che ho visto puoi ottenere solo l'URL della licenza e non solo una breve stringa che rappresenta il tipo di licenza.

Ecco un esempio per una mia soluzione che restituisce un elenco di voci, ciascuna composta dall'identificatore del pacchetto e dal collegamento alla licenza:

Get-Package | Select-Object Id,LicenseUrl

L'output è qualcosa del genere:

output get-package

Altri elementi che possono essere restituiti sono documentati nel riferimento Nuspec , nella sezione dei metadati (ad esempio la versione del pacchetto, una breve descrizione, ecc.).


Solo una nota: in VS2015 'LicenseUrl' restituisce sempre una stringa vuota. La documentazione di NuGet afferma che "LicenseUrl" sarà deprecato da v3.x sui reparti, ma non menziona alcuna alternativa
James Poulose,

A partire dal 4/24 tramite VS2017 questa risposta funziona.
justSteve

8

Basato su più fonti, ho creato uno script PowerShell che legge tutti i pacchetti NuGet e recupera i file di licenza e li inserisce in una cartella chiamata "licenze". Lo script dovrebbe essere eseguito sulla radice del progetto (dove si trova la cartella "pacchetti").

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

Disclaimer: non sono un esperto di PowerShell. Corri a tuo rischio :)

Non sono riuscito a trovare alcun codice semplice che rilevi la licenza del pacchetto NuGet, in base al suo file di licenza. L'unico progetto che si avvicina a una soluzione è il licenziatario , ma questo è costruito in Ruby.


0

Sono riuscito a ottenere le informazioni sulla licenza utilizzando il seguente comando:

@( @(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"}}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.