Dapatkan informasi lisensi untuk semua paket NuGet yang digunakan

26

Untuk menjaga agar rumah kami tetap teratur, saya ingin secara otomatis mengumpulkan lisensi untuk dependensi proyek dalam dokumentasi kami, daripada harus menambahkannya secara manual.

Adakah yang tahu cara sederhana untuk melintasi secara terprogram seperangkat file CSPROJ dan mengekstrak informasi lisensi untuk paket yang direferensikan sebagai tautan atau string?

Byron Ross
sumber
Ketika Anda mengatakan informasi lisensi maksud Anda string pendek yang mewakili jenis lisensi atau tautan yang menunjuk ke halaman lisensi di web? Bagaimana Anda ingin informasi ini dikembalikan, di jendela konsol atau, misalnya, dalam file CSV / HTML?
mguassa
Saya bisa mengambil tautan atau string. Saya lebih mencari cara terprogram untuk mengakses informasi di tempat pertama
Byron Ross

Jawaban:

25

Salah satu cara saya tahu untuk mendapatkan informasi tersebut adalah dengan menggunakan PowerShell di Package Manager Console , dari dalam Visual Studio .

Package Manager Console adalah konsol PowerShell dalam Visual Studio yang digunakan untuk berinteraksi dengan NuGet dan mengotomatiskan Visual Studio.

Pada dasarnya Anda dapat menggunakan cmdlet Get-Package untuk mendapatkan daftar paket yang direferensikan dalam proyek tertentu (atau dalam seluruh Solusi). Mengenai informasi lisensi untuk setiap paket, untuk apa yang saya lihat Anda hanya bisa mendapatkan URL lisensi dan bukan hanya string pendek yang mewakili jenis lisensi.

Berikut adalah contoh untuk Solusi milik saya yang mengembalikan daftar entri, masing-masing terdiri dari pengidentifikasi paket dan tautan ke lisensi:

Get-Package | Select-Object Id,LicenseUrl

Outputnya kira-kira seperti ini:

dapatkan paket-paket

Elemen-elemen lain yang dapat dikembalikan didokumentasikan dalam referensi Nuspec , di bagian metadata (misalnya versi paket, deskripsi singkat, dll.).

mguassa
sumber
Hanya sebuah catatan - Dalam VS2015 'LicenseUrl' selalu mengembalikan string kosong. Dokumentasi NuGet mengatakan 'LicenseUrl' akan dicabut dari v3.x di bangsal, tetapi tidak menyebutkan tentang alternatif apa pun
James Poulose
Pada 4/24 via VS2017 jawaban ini berfungsi.
justSteve
8

Berdasarkan beberapa sumber, saya telah membuat skrip PowerShell yang membaca semua paket NuGet dan mengambil file lisensi dan meletakkannya di folder yang disebut "lisensi". Skrip harus dijalankan di root proyek (di mana folder "paket" berada).

# 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)
    }
}

Penafian: Saya bukan pakar PowerShell. Jalankan dengan risiko Anda sendiri :)

Saya tidak dapat menemukan kode sederhana yang mendeteksi lisensi yang dimiliki paket NuGet, berdasarkan file lisensi itu. Satu-satunya proyek yang mendekati solusi adalah Penerima Lisensi , tetapi ini dibangun di Ruby.

Jerone
sumber
0

Saya berhasil mendapatkan informasi lisensi menggunakan perintah berikut:

@( @(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"}}
burly bogdan
sumber