使用されているすべてのNuGetパッケージのライセンス情報を取得する


26

家を整理するために、マニュアルでプロジェクトの依存関係のライセンスを手動で追加するのではなく、自動的にアセンブルします。

CSPROJファイルのセットをプログラムで走査し、参照されたパッケージのライセンス情報をリンクまたは文字列として抽出する簡単な方法を知っている人はいますか?


ライセンス情報とは、ライセンスの種類を表す短い文字列、またはWeb上のライセンスページを指すリンクを意味しますか?コンソールウィンドウまたはCSV / HTMLファイルなどで、この情報をどのように返しますか?
mguassa

リンクまたは文字列を取得できます。私はより多くの最初の場所で情報にアクセスするためのプログラム的な方法を探しています
バイロン・ロス

回答:


25

そのような情報を取得する1つの方法は、Visual Studio内からパッケージマネージャーコンソールPowerShellを使用することです。

パッケージマネージャーコンソールは、NuGetと対話してVisual Studioを自動化するために使用されるVisual Studio内のPowerShellコンソールです。

基本的に、Get-Packageコマンドレットを使用して、特定のプロジェクト(またはソリューション全体)で参照されているパッケージのリストを取得できます。各パッケージのライセンス情報については、ライセンスの種類を表す短い文字列だけでなく、ライセンスURLのみを取得できます。

以下は、パッケージ識別子とライセンスへのリンクで構成されるエントリのリストを返す私のソリューションの例です。

Get-Package | Select-Object Id,LicenseUrl

出力は次のようになります。

パッケージ出力を取得

返される可能性のある他の要素は、Nuspecリファレンスのメタデータセクションに記載されています(パッケージのバージョン、簡単な説明など)。


ほんの一言-VS2015では、「LicenseUrl」は常に空の文字列を返します。NuGetのドキュメントは、任意の選択肢については言及していない言い訳、「LicenseUrlは」病棟にバージョン3.xから廃止される予定だという
ジェームズPoulose

4/24現在、VS2017を介してこの回答は機能しています。
-justSteve

8

複数のソースに基づいて、すべての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でビルドされます。


0

次のコマンドを使用して、ライセンス情報を取得できました。

@( @(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"}}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.