우리 집을 정돈하기 위해 수동으로 추가하지 않고 설명서에 프로젝트 종속성에 대한 라이센스를 자동으로 조립하고 싶습니다.
누구나 프로그래밍 방식으로 CSPROJ 파일 집합을 탐색하고 참조 패키지에 대한 라이센스 정보를 링크 또는 문자열로 추출하는 간단한 방법을 알고 있습니까?
우리 집을 정돈하기 위해 수동으로 추가하지 않고 설명서에 프로젝트 종속성에 대한 라이센스를 자동으로 조립하고 싶습니다.
누구나 프로그래밍 방식으로 CSPROJ 파일 집합을 탐색하고 참조 패키지에 대한 라이센스 정보를 링크 또는 문자열로 추출하는 간단한 방법을 알고 있습니까?
답변:
이러한 정보를 얻는 한 가지 방법은 Visual Studio 내에서 패키지 관리자 콘솔의 PowerShell 을 사용하는 것 입니다.
패키지 관리자 콘솔은 NuGet과 상호 작용하고 Visual Studio를 자동화하는 데 사용되는 Visual Studio의 PowerShell 콘솔입니다.
기본적으로 Get-Package cmdlet 을 사용하면 특정 프로젝트 (또는 전체 솔루션)에서 참조되는 패키지 목록을 얻을 수 있습니다. 각 패키지의 라이센스 정보와 관련하여 내가 본 내용에 대해서는 라이센스 유형을 나타내는 짧은 문자열뿐만 아니라 라이센스 URL 만 얻을 수 있습니다.
다음은 각 솔루션이 패키지 식별자와 라이센스 링크로 구성된 항목 목록을 반환하는 솔루션의 예입니다.
Get-Package | Select-Object Id,LicenseUrl
출력은 다음과 같습니다.
반환 될 수있는 다른 요소는 Nuspec reference , 메타 데이터 섹션 (예 : 패키지 버전, 간단한 설명 등)에 문서화되어 있습니다.
여러 소스를 기반으로 모든 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로 빌드되었습니다.
다음 명령을 사용하여 라이센스 정보를 얻을 수있었습니다.
@( @(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"}}