รับข้อมูลสิทธิ์ใช้งานสำหรับแพ็คเกจ NuGet ที่ใช้แล้วทั้งหมด


26

เพื่อให้บ้านของเราเป็นไปตามลำดับฉันต้องการรวบรวมใบอนุญาตโดยอัตโนมัติสำหรับการอ้างอิงโครงการในเอกสารของเราแทนที่จะต้องเพิ่มด้วยตนเอง

ไม่มีใครรู้วิธีที่ง่ายในการสำรวจชุดของไฟล์ CSPROJ โดยทางโปรแกรมและแยกข้อมูลใบอนุญาตสำหรับแพ็คเกจอ้างอิงเป็นลิงค์หรือสตริง?


เมื่อคุณพูดข้อมูลใบอนุญาตคุณหมายถึงสตริงสั้น ๆ ที่แสดงประเภทใบอนุญาตหรือลิงค์ที่ชี้ไปยังหน้าใบอนุญาตบนเว็บ? คุณต้องการให้ข้อมูลนี้ถูกส่งกลับอย่างไรในหน้าต่างคอนโซลหรือในไฟล์ CSV / HTML
mguassa

ฉันสามารถใช้ลิงก์หรือสตริง ฉันกำลังมองหาวิธีการเขียนโปรแกรมเพื่อเข้าถึงข้อมูลในสถานที่แรก
Byron Ross

คำตอบ:


25

วิธีการหนึ่งที่ฉันรู้ว่าจะได้รับข้อมูลดังกล่าวโดยใช้PowerShellในคอนโซลการจัดการแพคเกจจากภายในVisual Studio

Package Manager Console เป็นคอนโซล PowerShell ภายใน Visual Studio ที่ใช้ในการโต้ตอบกับ NuGet และทำให้ Visual Studio เป็นไปโดยอัตโนมัติ

โดยทั่วไปคุณสามารถใช้Get-Package cmdletเพื่อรับรายการแพ็คเกจที่อ้างอิงในโครงการเฉพาะ (หรือในโซลูชันทั้งหมด) เกี่ยวกับข้อมูลสิทธิ์การใช้งานสำหรับแต่ละแพ็คเกจสิ่งที่ฉันเห็นคุณจะได้รับ URL สิทธิ์ใช้งานเท่านั้นไม่ใช่แค่สตริงสั้น ๆ ที่แสดงประเภทใบอนุญาต

ต่อไปนี้เป็นตัวอย่างสำหรับโซลูชันของฉันที่ส่งคืนรายการแต่ละรายการประกอบด้วยตัวระบุแพ็คเกจและลิงก์ไปยังใบอนุญาต:

Get-Package | Select-Object Id,LicenseUrl

ผลลัพธ์เป็นดังนี้:

รับแพคเกจเอาท์พุท

องค์ประกอบอื่น ๆ ที่สามารถส่งคืนได้มีการบันทึกไว้ในเอกสารอ้างอิง Nuspecในส่วนข้อมูลเมตา (เช่นเวอร์ชันของแพ็คเกจคำอธิบายสั้น ๆ ฯลฯ )


เพียงแค่ทราบ - ใน VS2015 'LicenseUrl' จะส่งคืนสตริงว่างเสมอ เอกสารของ NuGet กล่าวว่า 'LicenseUrl' จะถูกคัดค้านจาก v3.x บนหอผู้ป่วย แต่ไม่ได้กล่าวถึงทางเลือกอื่น ๆ
James Poulose

ตั้งแต่ 4/24 ถึง VS2017 คำตอบนี้ใช้ได้ผล
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 ที่อ้างอิงจากไฟล์สัญญาอนุญาต โครงการเดียวที่ใกล้กับโซลูชันคือผู้รับอนุญาตแต่นี่เป็นบิลด์ใน 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.