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?
Une façon que je connais pour obtenir de telles informations est d'utiliser PowerShell dans Package Manager Console , de l'intérieur 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 la 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:
D'autres éléments qui peuvent être retournés sont documentés dans référence Nuspec , dans la section des métadonnées (par exemple la version du package, une brève description, etc.).
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 Licencié , mais c'est construit dans Ruby.
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"}}