【问题标题】:Get license information for all used NuGet packages in .NET Core outside of Visual Studio在 Visual Studio 之外的 .NET Core 中获取所有使用的 NuGet 包的许可证信息
【发布时间】:2021-02-11 03:11:39
【问题描述】:

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

Get-Package | Select-Object Id,LicenseUrl

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

有什么方法可以在 .NET Core 中实现我们所需要的吗?

问候。

【问题讨论】:

    标签: asp.net-core .net-core nuget


    【解决方案1】:

    根据Nate McMaster's list of .NET global tools,有一个工具叫dotnet-project-licenses。我没用过,你可以试试看。

    不过,如果你想自己动手,这并不是很困难,但需要一些代码。

    首先使用dotnet list package --include-transitive 列出项目使用的所有包,并解析其输出。 NuGet 团队有a request 使输出更易于解析,但老实说,我认为您只需要 2 个正则表达式即可轻松解析其当前输出,如果您不关心 TFM,则只需 1 个。如果您的项目以多个 TFM 为目标,您需要对列表进行重复数据删除。

    获得包 ID 和版本号列表(版本很重要,因为包可能会在版本之间更改许可证)后,您可以找到全局包文件夹 (gpf) dotnet nuget locals -l global-packages 的位置,然后使用 @ 987654330@ 模式将 nuspec 加载为 XML 并找到许可证。

    请记住,最近 NuGet 已弃用 LicenseUrl,并鼓励包作者使用许可表达式,或将其许可文件嵌入到 nupkg。我想嵌入式许可证对任何许可证工具都是最大的挑战,因为除非您想解析许可证文本并猜测它最有可能是哪个许可证,否则您需要做其他事情。如果您所有的包都来自 nuget.org,您可以让您的工具生成指向 nuget.org/packages/{package id}/{package version}/license 的 URL。但是,如果您使用多个来源,则无法知道软件包来自哪个来源,并且其他提要可能无法轻松查看嵌入式许可证的许可证文本。要“正确”做事,您需要搜索您的包源以查看该特定包 ID 和版本是否存在。 NuGet's V3 protocol 已记录,但故意未记录 v2 协议,并且某些 3rd 方 nuget 服务器仅实现 v2 协议。您也可以考虑使用nuget client libraries

    【讨论】:

    • 还要注意版本信息必须是正确的形式。如果使用您自己的脚本解析您的 nuget 包。您可能有版本形式为:1.0.1.0 的软件包,但随后仅列出了 1.0.1 的 nuget 版本。这可以检查:https://api.nuget.org/v3-flatcontainer/{package id}/index.json。不过基本上用normalized version numbers应该够用了
    • 另见package content API doc的文档
    • dotnet-project-licenses 不支持 .net core 2.2
    • 根据 NuGet Gallery,此工具现在支持 .NET 5.0 和 .NET Core 3.1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多