Obtenha informações de licença para todos os pacotes NuGet usados

26

Para manter nossa casa em ordem, quero montar automaticamente licenças para dependências do projeto em nossa documentação, em vez de precisar adicioná-las manualmente.

Alguém conhece uma maneira simples de percorrer programaticamente um conjunto de arquivos CSPROJ e extrair as informações de licença dos pacotes referenciados como um link ou string?

Byron Ross
fonte
Quando você diz informações sobre a licença, quer dizer uma sequência curta que representa o tipo de licença ou um link apontando para a página de licença na Web? Como você deseja que essas informações sejam retornadas em uma janela de console ou, por exemplo, em um arquivo CSV / HTML?
mguassa
Eu poderia pegar o link ou uma string. Estou procurando uma maneira programática de acessar as informações em primeiro lugar
Byron Ross

Respostas:

25

Uma maneira de obter essas informações é usar o PowerShell no Package Manager Console , no Visual Studio .

O Console do Gerenciador de Pacotes é um console do PowerShell no Visual Studio usado para interagir com o NuGet e automatizar o Visual Studio.

Basicamente, você pode usar o cmdlet Get-Package para obter uma lista de pacotes referenciados em um projeto específico (ou em uma Solução inteira). Com relação às informações de licença de cada pacote, pelo que eu vi, você pode obter apenas o URL da licença e não apenas uma sequência curta que representa o tipo de licença.

Aqui está um exemplo de uma solução minha retornando uma lista de entradas, cada uma consistindo no identificador do pacote e no link para a licença:

Get-Package | Select-Object Id,LicenseUrl

A saída é algo como isto:

saída do pacote get

Outros elementos que podem ser retornados estão documentados na referência Nuspec , na seção de metadados (por exemplo, a versão do pacote, uma breve descrição, etc.).

mguassa
fonte
Apenas uma observação - no VS2015, 'LicenseUrl' sempre retorna uma string vazia. Documentação NuGet diz 'LicenseUrl' será obsoleto a partir v3.x em enfermarias, buts não menciona sobre quaisquer alternativas
James Poulose
A partir de 24/04, via VS2017, esta resposta funciona.
precisa
8

Com base em várias fontes, criei um script do PowerShell que lê todos os pacotes do NuGet e busca os arquivos de licença e o coloca em uma pasta chamada "licenças". O script deve ser executado na raiz do projeto (onde está localizada a pasta "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)
    }
}

Isenção de responsabilidade: não sou especialista em PowerShell. Corra por sua conta e risco :)

Não consegui encontrar nenhum código simples que detecta qual licença o pacote NuGet possui, com base no seu arquivo de licença. O único projeto que chega perto de uma solução é o Licenciado , mas isso é construído no Ruby.

Jerone
fonte
0

Consegui obter as informações da licença usando o seguinte 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"}}
corpulento bogdan
fonte