Nhận thông tin giấy phép cho tất cả các gói NuGet đã sử dụng


26

Để giữ cho ngôi nhà của chúng tôi theo thứ tự, tôi muốn tự động lắp ráp giấy phép cho các phụ thuộc dự án trong tài liệu của chúng tôi, thay vì phải thêm chúng bằng tay.

Có ai biết một cách đơn giản để duyệt qua chương trình một tập tin CSPROJ và trích xuất thông tin giấy phép cho các gói được tham chiếu dưới dạng liên kết hoặc chuỗi không?


Khi bạn nói thông tin giấy phép, bạn có nghĩa là một chuỗi ngắn đại diện cho loại giấy phép hoặc liên kết trỏ đến trang giấy phép trên web? Bạn muốn thông tin này được trả về như thế nào, trong cửa sổ bảng điều khiển hoặc, ví dụ, trong tệp CSV / HTML?
mguassa

Tôi có thể lấy liên kết hoặc chuỗi. Tôi đang tìm kiếm một cách lập trình để truy cập thông tin ở nơi đầu tiên
Byron Ross

Câu trả lời:


25

Một cách tôi biết để có được thông tin đó là sử dụng PowerShell trong Bảng điều khiển quản lý gói , từ bên trong Visual Studio .

Bảng điều khiển quản lý gói là bảng điều khiển PowerShell trong Visual Studio được sử dụng để tương tác với NuGet và tự động hóa Visual Studio.

Về cơ bản, bạn có thể sử dụng lệnh ghép ngắn Get-Pack để lấy danh sách các gói được tham chiếu trong một dự án cụ thể (hoặc trong toàn bộ Giải pháp). Về thông tin giấy phép cho mỗi gói, đối với những gì tôi đã thấy, bạn chỉ có thể nhận URL giấy phép và không chỉ là một chuỗi ngắn đại diện cho loại giấy phép.

Đây là một ví dụ cho một Giải pháp của tôi trả về một danh sách các mục, mỗi mục bao gồm mã định danh gói và liên kết đến giấy phép:

Get-Package | Select-Object Id,LicenseUrl

Đầu ra là một cái gì đó như thế này:

đầu ra gói

Các yếu tố khác có thể được trả về được ghi lại trong tài liệu tham khảo Nuspec , trong phần siêu dữ liệu (ví dụ: phiên bản của gói, mô tả ngắn, v.v.).


Chỉ cần một lưu ý - Trong VS2015 'LicenseUrl' luôn trả về một chuỗi trống. Tài liệu của NuGet cho biết 'LicenseUrl' sẽ không được chấp nhận từ v3.x trên các phường, nhưng không đề cập đến bất kỳ giải pháp thay thế nào
James Poulose

Kể từ 4/24 qua VS2017, câu trả lời này hoạt động.
justSteve

8

Dựa trên nhiều nguồn, tôi đã tạo một tập lệnh PowerShell để đọc tất cả các gói NuGet và tìm nạp các tệp giấy phép và đặt nó vào một thư mục có tên là "giấy phép". Kịch bản nên được chạy trên thư mục gốc của dự án (nơi đặt thư mục "gói").

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

Tuyên bố miễn trừ trách nhiệm: Tôi không phải là chuyên gia PowerShell. Chạy có nguy cơ của riêng bạn :)

Tôi không thể tìm thấy bất kỳ mã đơn giản nào phát hiện gói NuGet có giấy phép nào, dựa trên tệp giấy phép của nó. Dự án duy nhất gần với giải pháp là Licensee , nhưng đây là bản dựng trong Ruby.


0

Tôi quản lý để có được thông tin giấy phép bằng cách sử dụng lệnh sau:

@( @(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"}}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.