Ottieni informazioni sulla licenza per tutti i pacchetti NuGet usati

17

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 un insieme di file CSPROJ ed estrarre le informazioni sulla licenza per i pacchetti di riferimento come un collegamento o una stringa?

    
posta Byron Ross 07.04.2014 - 06:15
fonte

3 risposte

15

Un modo che conosco per ottenere tali informazioni è utilizzando PowerShell nel Gestore pacchetti Console , all'interno di Visual Studio .

The Package Manager Console is a PowerShell console within Visual Studio used to interact with NuGet and automate Visual Studio.

In pratica puoi usare il cmdlet Get-Package per ottenere un elenco di pacchetti referenziato 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 di una Soluzione che restituisce un elenco di voci, ognuna costituita dall'identificatore del pacchetto e il link alla licenza:

Get-Package | Select-Object Id,LicenseUrl

L'output è qualcosa del tipo:

Altrielementichepossonoessererestituitisonodocumentatinel riferimento Nuspec , nella sezione dei metadati (ad esempio la versione del pacchetto, una breve descrizione, ecc.).

    
risposta data 16.06.2015 - 20:19
fonte
3

Sulla base di 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 denominata "licenze". Lo script dovrebbe essere eseguito nella root del progetto (dove si trova la cartella "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)
    }
}

Disclaimer: non sono un esperto di PowerShell. Esegui a proprio rischio:)

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

    
risposta data 15.01.2018 - 14:18
fonte
0

Sono riuscito ad ottenere le informazioni sulla licenza usando 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"}}
    
risposta data 30.09.2015 - 17:55
fonte

Leggi altre domande sui tag