सभी उपयोग किए गए NuGet पैकेजों के लिए लाइसेंस जानकारी प्राप्त करें


26

हमारे घर को क्रम में रखने के लिए, मैं अपने दस्तावेज़ में प्रोजेक्ट निर्भरता के लिए लाइसेंस को स्वचालित रूप से इकट्ठा करना चाहता हूं, बजाय उन्हें मैन्युअल रूप से जोड़ने के।

क्या किसी को प्रोग्रामर सीएससीआरजे फाइलों का एक सेट का पता लगाने और एक लिंक या स्ट्रिंग के रूप में संदर्भित पैकेज के लिए लाइसेंस जानकारी निकालने का एक सरल तरीका पता है?


जब आप कहते हैं कि लाइसेंस की जानकारी का मतलब है कि आप लाइसेंस प्रकार या वेब पर लाइसेंस पृष्ठ की ओर इशारा करते हुए एक छोटी स्ट्रिंग का प्रतिनिधित्व करते हैं? आप इस जानकारी को कैसे लौटा सकते हैं, कंसोल विंडो में या, उदाहरण के लिए, CSV / HTML फ़ाइल में?
मुगस्सा

मैं या तो लिंक या एक स्ट्रिंग ले सकता है। मैं पहली बार सूचना को एक्सेस करने के लिए प्रोग्रामेटिक तरीके की तलाश कर रहा हूं
बायरन रॉस

जवाबों:


25

विज़ुअल स्टूडियो के भीतर से पैकेज मैनेजर कंसोल में पावरशेल का उपयोग करके ऐसी जानकारी प्राप्त करने का एक तरीका मुझे पता है ।

पैकेज मैनेजर कंसोल विजुअल स्टूडियो के भीतर एक पॉवरशेल कंसोल है जिसका उपयोग नुगेट के साथ बातचीत करने और विजुअल स्टूडियो को स्वचालित करने के लिए किया जाता है।

मूल रूप से आप गेट-पैकेज cmdlet का उपयोग किसी विशिष्ट परियोजना (या संपूर्ण समाधान में) संदर्भित पैकेज की सूची प्राप्त करने के लिए कर सकते हैं । प्रत्येक पैकेज के लिए लाइसेंस की जानकारी के बारे में, जो मैंने देखा है, उसके लिए आप केवल लाइसेंस URL प्राप्त कर सकते हैं, न कि केवल लाइसेंस प्रकार का प्रतिनिधित्व करने वाला एक छोटा स्ट्रिंग।

यहां प्रविष्टियों की सूची लौटाने वाले मेरे समाधान के लिए एक उदाहरण है, हर एक में पैकेज पहचानकर्ता और लाइसेंस के लिंक शामिल हैं:

Get-Package | Select-Object Id,LicenseUrl

आउटपुट कुछ इस प्रकार है:

पैकेज उत्पादन प्राप्त करें

अन्य तत्व जिन्हें लौटाया जा सकता है , उन्हें मेटाडेटा अनुभाग (उदाहरण के लिए पैकेज का संस्करण, संक्षिप्त विवरण आदि) में Nuspec संदर्भ में प्रलेखित किया गया है ।


बस एक नोट - VS2015 में 'लाइसेंस यूआरएल' हमेशा एक खाली स्ट्रिंग लौटाता है। NuGet प्रलेखन का कहना है कि 'लाइसेंसयूएलआर' को वार्डों पर v3.x से हटा दिया जाएगा, लेकिन किसी भी विकल्प के बारे में उल्लेख नहीं किया गया है
जेम्स पॉउलॉज

VS2017 के माध्यम से 4/24 तक यह उत्तर काम करता है।
JustSteve

8

कई स्रोतों के आधार पर, मैंने एक PowerShell स्क्रिप्ट बनाई है जो सभी NuGet पैकेज पढ़ती है और लाइसेंस फ़ाइलों को प्राप्त करती है और "लाइसेंस" नामक एक फ़ोल्डर में डालती है। स्क्रिप्ट को प्रोजेक्ट के रूट पर चलाया जाना चाहिए (जहां "पैकेज" फ़ोल्डर स्थित है)।

# 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 पैकेज का लाइसेंस किसके पास है। एकमात्र प्रोजेक्ट जो किसी समाधान के करीब आता है , वह है लाइसेंसधारी , लेकिन यह रूबी में बनाया गया है।


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"}}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.