Obtenez les informations de licence pour tous les packages NuGet utilisés

26

Pour garder notre maison en ordre, je veux assembler automatiquement les licences pour les dépendances du projet dans notre documentation, plutôt que d'avoir à les ajouter manuellement.

Quelqu'un connaît-il un moyen simple de parcourir par programme un ensemble de fichiers CSPROJ et d'extraire les informations de licence pour les packages référencés sous forme de lien ou de chaîne?

Byron Ross
la source
Lorsque vous dites informations sur la licence, vous voulez dire une courte chaîne représentant le type de licence ou un lien pointant vers la page de licence sur le Web? Comment souhaitez-vous que ces informations soient renvoyées, dans une fenêtre de console ou, par exemple, dans un fichier CSV / HTML?
mguassa
Je pourrais prendre le lien ou une chaîne. Je cherche plutôt un moyen programmatique d'accéder à l'information en premier lieu
Byron Ross

Réponses:

25

Une façon que je connais pour obtenir de telles informations est d'utiliser PowerShell dans la console du gestionnaire de packages , à partir de Visual Studio .

La console du gestionnaire de packages est une console PowerShell dans Visual Studio utilisée pour interagir avec NuGet et automatiser Visual Studio.

Fondamentalement, vous pouvez utiliser l' applet de commande Get-Package pour obtenir une liste des packages référencés dans un projet spécifique (ou dans une solution entière). En ce qui concerne les informations de licence pour chaque package, pour ce que j'ai vu, vous ne pouvez obtenir que l'URL de la licence et pas seulement une courte chaîne représentant le type de licence.

Voici un exemple pour une de mes solutions renvoyant une liste d'entrées, chacune comprenant l'identifiant du package et le lien vers la licence:

Get-Package | Select-Object Id,LicenseUrl

La sortie est quelque chose comme ceci:

sortie get-package

D'autres éléments qui peuvent être retournés sont documentés dans la référence Nuspec , dans la section des métadonnées (par exemple la version du package, une brève description, etc.).

mguassa
la source
Juste une note - Dans VS2015 'LicenseUrl' renvoie toujours une chaîne vide. La documentation de NuGet indique que «LicenseUrl» sera déconseillé de v3.x sur les services, mais ne mentionne aucune alternative
James Poulose
À partir du 4/24 via VS2017, cette réponse fonctionne.
justSteve
8

Basé sur plusieurs sources, j'ai créé un script PowerShell qui lit tous les packages NuGet et récupère les fichiers de licence et les place dans un dossier appelé "licences". Le script doit être exécuté à la racine du projet (où se trouve le dossier "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)
    }
}

Avertissement: je ne suis pas un expert PowerShell. Courez à vos risques et périls :)

Je n'ai trouvé aucun code simple qui détecte la licence du package NuGet, sur la base de son fichier de licence. Le seul projet qui se rapproche d'une solution est le titulaire de licence , mais il s'agit d'un build en Ruby.

jerone
la source
0

J'ai réussi à obtenir les informations de licence à l'aide de la commande suivante:

@( @(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 costaud
la source