使用go get获取第三方许可证

4
假设我们有一个定义第三方依赖项的go.mod文件。是否有语言中的功能或方法,最好是不使用第三方工具就能获取第三方许可证列表?不幸的是,我还没有找到任何潜在的解决方案,因此无法分享任何代码。
例如,我们有:
module github.com/myGoProject

require (
    github.com/sirupsen/logrus v1.4.2
    github.com/stretchr/testify v1.2.2
)

我该如何得到以下输出结果:
MIT MIT

3
这并不是 Go 工具链的一个特性,因为没有强制性的标准来存储许可证信息。你也许可以猜测(例如通过检查根目录下的 LICENSE.txt 或类似文件),但你需要自己编写工具来实现。 - Jonathan Hall
1个回答

6
我最近也需要做这个,并没有找到任何“官方”方法。我使用了一个叫做go-license-detector的工具来自动化大部分工作,扫描我的第三方依赖库。
  1. 安装https://github.com/src-d/go-license-detector。该工具会扫描目录中的许可文件并确定它们(可能)是什么许可证。
  2. 通过运行go mod vendor下载所有第三方库依赖的源代码。这将把所有依赖项的源代码放入一个名为“vendor”的目录中。
  3. cd进入您的vendor目录并运行:

    license-detector `cat modules.txt |grep "^#" |cut -d' ' -f2`

这将针对每个已下载的模块运行license-detector,并输出每个模块的可能许可证列表。您将获得如下所示的输出:

github.com/influxdata/influxdb
    91% MIT
github.com/influxdata/platform
    99% MIT
    84% MIT-feh
github.com/kr/logfmt
    100%    Unlicense
    98% MIT
    93% JSON
    84% MIT-feh

通常来说,顶部的许可证是正确的,但最好仔细检查每一个许可证。

2
谢谢。但完整的依赖图不是在 go.sum 中吗?modules.txt 似乎更接近 go.mod,其中包含(大多数)直接依赖项? - Mohan Raj
供应商依赖的目的是为了拥有构建所需的所有依赖项的本地副本,因此供应商目录(和modules.txt)将具有您的所有直接依赖项(来自go.mod)以及所有传递依赖项。作为一个实验,我还尝试删除我的~/go目录中缓存的所有内容,并验证使用-mod=vendor标志构建不需要下载任何其他内容。 - Mark A
它运行得非常缓慢。在我的 Windows 10 电脑上,检测一个 Apache-2.0 许可证花费了 32 秒,并正确输出“100%Apache-2.0”。它声称可以在读取自述文件的 1000 个存储库中在 13 秒内完成此操作。 - Phani Rithvij

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接