私たちの家を整頓するために、プロジェクトの依存関係のライセンスを手動で追加するのではなく、ドキュメントに自動的にまとめたいと思います。
プログラムで一連のCSPROJファイルを走査し、参照されたパッケージのライセンス情報をリンクまたは文字列として抽出する簡単な方法を知っている人はいますか?
このような情報を取得する方法の1つは、PowerShellを Package Manager Console 内でVisual Studio。
パッケージマネージャーコンソールは、NuGetと対話してVisual Studioを自動化するために使用されるVisual Studio内のPowerShellコンソールです。
基本的に、 Get-Packageコマンドレット を使用して、特定のプロジェクト(またはソリューション全体)で参照されるパッケージのリストを取得できます。各パッケージのライセンス情報については、私が見た場合、ライセンスの種類を表す短い文字列だけではなく、ライセンスのURLしか取得できません。
以下は、Solution of mineがエントリのリストを返す例です。各エントリは、パッケージ識別子とライセンスへのリンクで構成されています。
Get-Package | Select-Object Id,LicenseUrl
出力は次のようになります。
返すことができるその他の要素は、メタデータセクションの Nuspecリファレンス に記載されています(たとえば、パッケージのバージョン、短い説明など)。
複数のソースに基づいて、すべてのNuGetパッケージを読み取り、ライセンスファイルをフェッチしてそれを「licenses」というフォルダーに配置するPowerShellスクリプトを作成しました。スクリプトは、プロジェクトのルート( "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)
}
}
免責事項:私はPowerShellの専門家ではありません。自己責任で実行してください:)
ライセンスファイルに基づいて、NuGetパッケージがどのライセンスを持っているかを検出する単純なコードを見つけることができませんでした。ソリューションに近い唯一のプロジェクトは Licensee ですが、これはRubyでビルドされています。
次のコマンドを使用して、ライセンス情報を取得することができました。
@( @(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"}}