获取 Visual Studio 之外的 .NET Core 中所有使用的 NuGet 包的许可证信息

问题描述 投票:0回答:3

我们的项目要求列出所有获得许可的 nuget 包。将它们生成为某种 csv、json、xml 文件是理想的选择。它必须通过构建或 CI/CD 工具来完成。问题是我发现获得该列表的唯一方法是通过调用:

Get-Package | Select-Object Id,LicenseUrl

Visual Studios 包管理器内部。我还发现了一些示例 powershell 脚本,但它们都基于 .net core 之前的 .net 版本,并且基于读取 .net core 版本中不再存在的包文件夹。

.NET Core 有没有办法实现我们所需要的?

问候。

asp.net-core .net-core nuget
3个回答
25
投票

根据 Nate McMaster 的 .NET 全局工具列表,有一个名为 dotnet-project-licenses 的工具。我没用过,不过你可以试试。

但是,如果你想自己做事情,这并不是很困难,但需要一些代码。

首先使用

dotnet list package --include-transitive
列出项目使用的所有包,并解析其输出。 NuGet 团队有一个要求让输出更易于解析,但老实说,我认为您只需要 2 个正则表达式即可轻松解析其当前输出,如果您不关心 TFM,则只需 1 个。如果您的项目针对多个 TFM,您将需要对列表进行重复数据删除。 一旦您获得了软件包 ID 和版本号列表(版本很重要,因为软件包可能会更改版本之间的许可证),您可以找到全局软件包文件夹 (gpf) 的位置

dotnet nuget locals -l global-packages

,然后使用

{gpf}\{lowercase package id}\{lowercase package version}\{lowercase package id}.{lowercase package version}.nuspec
模式以 XML 形式加载 nuspec 并查找许可证。
请记住,最近 NuGet 已弃用 LicenseUrl,并鼓励包作者使用许可证表达式,或将其许可证文件嵌入到 

nupkg

中。我认为嵌入式许可证对任何许可证工具都构成了最大的挑战,因为除非您想解析许可证文本并猜测它最有可能是哪个许可证,否则您需要做其他事情。如果您的所有包都来自 nuget.org,您可以让您的工具生成指向

nuget.org/packages/{package id}/{package version}/license
的 url。但是,如果您使用多个源,则无法知道包来自哪个源,并且其他源可能没有简单的方法来查看嵌入式许可证的许可证文本。为了“正确”地执行操作,您需要搜索软件包源以查看特定的软件包 ID 和版本是否存在。
NuGet 的 V3 协议
已记录,但 v2 协议有意未记录,并且某些 3rd 方 nuget 服务器仅实现 v2 协议。您还可以考虑使用 nuget 客户端库


7
投票
dotnet-project-licenses

CLI 工具与当前版本的 .NET Core 配合良好,并且设置起来非常简单/快速。 如果您想运行该工具来报告当前目录中的解决方案或项目,您可以按照以下步骤操作:

安装工具
  1. dotnet tool install --global dotnet-project-licenses
针对当前目录运行该工具(使用 -i 标志指定输入目录)
  1. dotnet-project-licenses -i .
这将产生与此类似的输出:

Project Reference(s) Analysis... References: | Reference | Version | License Type | License | |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Bogus | 34.0.2 | | https://raw.githubusercontent.com/bchavez/Bogus/master/LICENSE | | coverlet.collector | 3.2.0 | MIT | https://licenses.nuget.org/MIT | | CsvHelper | 30.0.1 | MS-PL OR Apache-2.0 | https://licenses.nuget.org/MS-PL%20OR%20Apache-2.0 |

有很多选项可用于自定义输出,但由于问题专门询问了机器可读格式,因此这里是使用 
-j

--json
标志的示例摘录:
[
    {
        "PackageName": "coverlet.collector",
        "PackageVersion": "3.2.0",
        "PackageUrl": "https://github.com/coverlet-coverage/coverlet",
        "Copyright": "",
        "Authors": [
            "tonerdo"
        ],
        "Description": "Coverlet is a cross platform code coverage library for .NET, with support for line, branch and method coverage.",
        "LicenseUrl": "https://licenses.nuget.org/MIT",
        "LicenseType": "MIT"
    },
    {
        "PackageName": "CsvHelper",
        "PackageVersion": "30.0.1",
        "PackageUrl": "https://joshclose.github.io/CsvHelper/",
        "Copyright": "Copyright © 2009-2022 Josh Close",
        "Authors": [
            "Josh Close"
        ],
        "Description": "A library for reading and writing CSV files. Extremely fast, flexible, and easy to use. Supports reading and writing of custom class objects.",
        "LicenseUrl": "https://licenses.nuget.org/MS-PL%20OR%20Apache-2.0",
        "LicenseType": "MS-PL OR Apache-2.0"
    },
    ...
]



0
投票

sensslen/nuget-license。我的 Docker 中的代码是: dotnet tool install --global nuget-license PATH=$PATH:/root/.dotnet/tools lic_file="$nuget-licenses.json" sln="$(find *.sln | head -1)" nuget-license --input "$sln" --allowed-license-types "$lic_file" --error-only

看起来 

tomchavakis/nuget-license 已被放弃:

Abandoned message

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.