Tüm kullanılmış NuGet paketlerinin lisans bilgilerini alın


26

Evimizi düzenli tutmak için, manuel olarak eklemek yerine, dokümantasyonumuzdaki proje bağımlılıkları için lisansları otomatik olarak bir araya getirmek istiyorum.

Programlı bir dizi CSPROJ dosyasını geçmek ve başvurulan paketlerin lisans bilgilerini bağlantı veya dize olarak çıkarmak için basit bir yol bilen var mı?


Lisans bilgilerini söylerken, lisans türünü temsil eden kısa bir dize mi yoksa web üzerindeki lisans sayfasına işaret eden bir bağlantı mı demek istiyorsunuz? Bu bilgilerin bir konsol penceresinde veya örneğin bir CSV / HTML dosyasında nasıl döndürülmesini istersiniz?
mguassa

Bağlantıyı veya dizeyi alabilirim. Daha ilk başta bilgiye erişmek için programlı bir yol arıyorum
Byron Ross

Yanıtlar:


25

Böyle bilgi almak bilmek bir yolu kullanmaktır PowerShell içinde Paket Yöneticisi Konsolundan içinden, Visual Studio .

Paket Yöneticisi Konsolu, NuGet ile etkileşim kurmak ve Visual Studio'yu otomatikleştirmek için kullanılan Visual Studio içindeki bir PowerShell konsoludur.

Temel olarak, belirli bir projede (veya Çözümün tamamında) başvurulan paketlerin bir listesini almak için Get-Package cmdlet'ini kullanabilirsiniz. Her paket için lisans bilgileriyle ilgili olarak, gördüğümler için, yalnızca lisans türünü temsil eden kısa bir dize değil yalnızca lisans URL'sini alabilirsiniz.

İşte her biri paket tanımlayıcı ve lisans bağlantısına sahip bir giriş listesi döndüren bir mayın çözümüne bir örnek:

Get-Package | Select-Object Id,LicenseUrl

Çıktı şöyle:

paket almak

İade edilebilecek diğer öğeler, Nuspec referansında , meta veri bölümünde (örneğin paketin sürümü, kısa bir açıklama vb.) Belgelenmiştir .


Sadece bir not - VS2015'te 'LicenseUrl' her zaman boş bir dize döndürür. NuGet belgelerine göre, 'LicenseUrl' v3.x'ten koğuşlarda kullanımdan kaldırılacak, ancak başka seçeneklerden bahsetmiyor
James Poulose

VS2017 üzerinden 4/24 itibariyle bu cevap işe yarıyor.
sadeceSteve

8

Birden fazla kaynağa dayanarak, tüm NuGet paketlerini okuyan, lisans dosyalarını alan ve "lisanslar" adlı bir klasöre yerleştiren bir PowerShell betiği hazırladım. Komut dosyası projenin kökü üzerinde çalıştırılmalıdır ("paketler" klasörünün bulunduğu yer).

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

Yasal Uyarı: PowerShell uzmanı değilim. Kendi sorumluluğunuzdadır :)

NuGet paketinin lisans dosyasına bağlı olarak hangi lisansa sahip olduğunu tespit eden basit bir kod bulamadım. Bir çözüme yaklaşan tek proje Lisans Alan'dır , ancak bu Ruby'de inşa edilmiştir.


0

Aşağıdaki komutu kullanarak lisans bilgisini almayı başardım:

@( @(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"}}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.