获取所有使用过的NuGet软件包的许可证信息


26

为了使我们的屋子井井有条,我想在我们的文档中自动为项目相关性组装许可证,而不必手动添加许可证。

有人知道一种简单的方法来以编程方式遍历一组CSPROJ文件并为链接或字符串提取所引用软件包的许可证信息吗?


当您说许可证信息时,您是指代表许可证类型的短字符串还是指向网络上许可证页面的链接?您希望如何在控制台窗口或例如CSV / HTML文件中返回此信息?
mguassa

我可以选择链接或字符串。我更想寻找一种以编程方式访问信息的方式
拜伦·罗斯

Answers:


25

我知道获得此类信息的一种方法是在Visual Studio中使用Package Manager控制台中的PowerShell

程序包管理器控制台是Visual Studio中的PowerShell控制台,用于与NuGet交互并自动执行Visual Studio。

基本上,您可以使用Get-Package cmdlet获取在特定项目(或整个解决方案)中引用的软件包的列表。关于每个软件包的许可证信息,据我所知,您只能获取许可证URL,而不仅仅是代表许可证类型的短字符串。

这是我的解决方案的示例,该示例返回一个条目列表,每个条目均由软件包标识符和许可证链接组成:

Get-Package | Select-Object Id,LicenseUrl

输出是这样的:

获取包输出

可以返回的其他元素记录在Nuspec参考资料的元数据部分中(例如,软件包的版本,简短说明等)。


请注意-在VS2015中,“ LicenseUrl”始终返回空字符串。NuGet文档说“ LicenseUrl”将在病房中从v3.x中弃用,但没有提及任何替代方法
James Poulose 2015年

从4/24开始,通过VS2017,此答案有效。
justSteve

8

基于多个来源,我制作了一个PowerShell脚本,该脚本可读取所有NuGet程序包并获取许可证文件,并将其放入名为“ licenses”的文件夹中。该脚本应在项目的根目录(“ 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"}}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.