사용 된 모든 NuGet 패키지에 대한 라이센스 정보 얻기


26

우리 집을 정돈하기 위해 수동으로 추가하지 않고 설명서에 프로젝트 종속성에 대한 라이센스를 자동으로 조립하고 싶습니다.

누구나 프로그래밍 방식으로 CSPROJ 파일 집합을 탐색하고 참조 패키지에 대한 라이센스 정보를 링크 또는 문자열로 추출하는 간단한 방법을 알고 있습니까?


라이센스 정보를 말하면 라이센스 유형을 나타내는 짧은 문자열 또는 웹의 라이센스 페이지를 가리키는 링크를 의미합니까? 콘솔 창 또는 예를 들어 CSV / HTML 파일에서이 정보를 어떻게 반환 하시겠습니까?
mguassa 2016 년

나는 링크 나 문자열을 취할 수 있습니다. 나는 정보에 접근 할 수있는 프로그래밍 방식을 찾고있다
바이런 로스

답변:


25

이러한 정보를 얻는 한 가지 방법은 Visual Studio 내에서 패키지 관리자 콘솔의 PowerShell 을 사용하는 것 입니다.

패키지 관리자 콘솔은 NuGet과 상호 작용하고 Visual Studio를 자동화하는 데 사용되는 Visual Studio의 PowerShell 콘솔입니다.

기본적으로 Get-Package cmdlet 을 사용하면 특정 프로젝트 (또는 전체 솔루션)에서 참조되는 패키지 목록을 얻을 수 있습니다. 각 패키지의 라이센스 정보와 관련하여 내가 본 내용에 대해서는 라이센스 유형을 나타내는 짧은 문자열뿐만 아니라 라이센스 URL 만 얻을 수 있습니다.

다음은 각 솔루션이 패키지 식별자와 라이센스 링크로 구성된 항목 목록을 반환하는 솔루션의 예입니다.

Get-Package | Select-Object Id,LicenseUrl

출력은 다음과 같습니다.

패키지 출력

반환 될 수있는 다른 요소는 Nuspec reference , 메타 데이터 섹션 (예 : 패키지 버전, 간단한 설명 등)에 문서화되어 있습니다.


참고 사항-VS2015에서 'LicenseUrl'은 항상 빈 문자열을 반환합니다. NuGet 문서는 병동 V3.0의에서 더 이상 사용되지 않습니다 'LicenseUrl'을 말한다 꾸물 거리지 어떤 대안에 대해 언급하지 않는다
제임스 Poulose

VS2017을 통한 4/24 현재이 답변이 작동합니다.
justSteve

8

여러 소스를 기반으로 모든 NuGet 패키지를 읽고 라이센스 파일을 가져 와서 "licenses"라는 폴더에 넣는 PowerShell 스크립트를 만들었습니다. 스크립트는 프로젝트의 루트 ( "packages"폴더가있는 곳)에서 실행해야합니다.

# 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 패키지의 라이센스를 감지하는 간단한 코드를 찾을 수 없습니다. 솔루션과 가까운 유일한 프로젝트는 Licensee 이지만 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.