Obtenga información de licencia para todos los paquetes NuGet usados

26

Para mantener nuestra casa en orden, quiero reunir automáticamente las licencias para las dependencias del proyecto en nuestra documentación, en lugar de tener que agregarlas manualmente.

¿Alguien sabe una manera simple de atravesar mediante programación un conjunto de archivos CSPROJ y extraer la información de licencia para los paquetes a los que se hace referencia como un enlace o cadena?

Byron Ross
fuente
Cuando dice información de licencia, ¿se refiere a una cadena corta que representa el tipo de licencia o un enlace que apunta a la página de licencia en la web? ¿Cómo desea que se devuelva esta información, en una ventana de consola o, por ejemplo, en un archivo CSV / HTML?
mguassa
Podría tomar el enlace o una cadena. Estoy buscando más una forma programática para acceder a la información en primer lugar
Byron Ross

Respuestas:

25

Una forma en que sé obtener dicha información es mediante el uso de PowerShell en la consola de Package Manager , desde Visual Studio .

Package Manager Console es una consola de PowerShell dentro de Visual Studio que se usa para interactuar con NuGet y automatizar Visual Studio.

Básicamente, puede usar el cmdlet Get-Package para obtener una lista de paquetes a los que se hace referencia en un proyecto específico (o en una Solución completa). Con respecto a la información de la licencia para cada paquete, por lo que he visto, solo puede obtener la URL de la licencia y no solo una cadena corta que representa el tipo de licencia.

Aquí hay un ejemplo para una Solución mía que devuelve una lista de entradas, cada una de las cuales consta del identificador del paquete y el enlace a la licencia:

Get-Package | Select-Object Id,LicenseUrl

El resultado es algo como esto:

salida get-package

Otros elementos que pueden devolverse se documentan en la referencia de Nuspec , en la sección de metadatos (por ejemplo, la versión del paquete, una breve descripción, etc.).

mguassa
fuente
Solo una nota: en VS2015, 'LicenseUrl' siempre devuelve una cadena vacía. La documentación de NuGet dice que 'LicenseUrl' quedará en desuso desde v3.x en las salas, pero no menciona ninguna alternativa
James Poulose,
A partir del 4/24 a través de VS2017, esta respuesta funciona.
justSteve
8

Basado en múltiples fuentes, he creado un script de PowerShell que lee todos los paquetes de NuGet y busca los archivos de licencia y los coloca en una carpeta llamada "licencias". El script debe ejecutarse en la raíz del proyecto (donde se encuentra la carpeta "paquetes").

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

Descargo de responsabilidad: no soy un experto en PowerShell. Corre bajo tu propio riesgo :)

No pude encontrar ningún código simple que detecte qué licencia tiene el paquete NuGet, en función de su archivo de licencia. El único proyecto que se acerca a una solución es el Licenciatario , pero se construye en Ruby.

Jerone
fuente
0

Logré obtener la información de la licencia con el siguiente 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"}}
bogdan corpulento
fuente