家を整理するために、マニュアルでプロジェクトの依存関係のライセンスを手動で追加するのではなく、自動的にアセンブルします。
CSPROJファイルのセットをプログラムで走査し、参照されたパッケージのライセンス情報をリンクまたは文字列として抽出する簡単な方法を知っている人はいますか?
家を整理するために、マニュアルでプロジェクトの依存関係のライセンスを手動で追加するのではなく、自動的にアセンブルします。
CSPROJファイルのセットをプログラムで走査し、参照されたパッケージのライセンス情報をリンクまたは文字列として抽出する簡単な方法を知っている人はいますか?
回答:
そのような情報を取得する1つの方法は、Visual Studio内からパッケージマネージャーコンソールでPowerShellを使用することです。
パッケージマネージャーコンソールは、NuGetと対話してVisual Studioを自動化するために使用されるVisual Studio内のPowerShellコンソールです。
基本的に、Get-Packageコマンドレットを使用して、特定のプロジェクト(またはソリューション全体)で参照されているパッケージのリストを取得できます。各パッケージのライセンス情報については、ライセンスの種類を表す短い文字列だけでなく、ライセンスURLのみを取得できます。
以下は、パッケージ識別子とライセンスへのリンクで構成されるエントリのリストを返す私のソリューションの例です。
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パッケージのライセンスを検出する簡単なコードが見つかりませんでした。ソリューションに近づく唯一のプロジェクトはライセンシーですが、これは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"}}