【问题标题】:Output all licenses of installed node.js libraries输出已安装的 node.js 库的所有许可证
【发布时间】:2021-11-13 10:46:03
【问题描述】:

npm(或其他工具)中是否有打印所有使用过的许可证的选项? 我有一个项目,我想确保我不使用我无法使用的许可证下的库。

编辑:发现许多开发人员没有在 package.json 中包含许可证,所以我不得不使用“npm docs package-name”手动查找

【问题讨论】:

  • 晚会有点晚,但 npm grunt-license 完全符合您的要求 - 这假设 grunt 正在或将被使用 ;)

标签: node.js npm


【解决方案1】:

我有完全相同的要求,并编写了一个节点模块来执行此操作。我知道无耻的自我推销,但它是开源的,希望它可以帮助解决您的问题。如果您有任何问题或建议,请告诉我。

与其他答案的不同之处在于,它不仅使用 package.json 许可证声明,而且在项目的许可证和自述文件中查找潜在的许可证信息。

https://npmjs.org/package/nlf

您可以使用npm install -g nlf进行安装

【讨论】:

  • nlf 最好的部分是传递 CLI 参数 -c 以获取 CSV 输出——因此您运行 nlf -c -r 0 > licenses.csv,您将获得所有具有许可证的根级依赖项类型和指向其存储库的链接。提供给您的法律团队的完美输出:-)
  • 这是一个很棒的项目,感谢@iandotkelly 的分享。出于我的需要,我使用了命令nlf -c -r 20 > licenses-alllevels.csv 来覆盖所有递归级别。
【解决方案2】:
cd {project}/node_modules
ls | sed 's/$/\/package.json/' | xargs grep '"license[s]*"' -A 3

可以使用一些改进,但它可以工作(至少在 osx 上,应该在 linux 上工作,不知道 windows)。您应该会看到如下内容:

grunt/package.json:  "licenses": [
grunt/package.json-    {
grunt/package.json-      "type": "MIT",
grunt/package.json-      "url": "http://github.com/gruntjs/grunt/blob/master/LICENSE-MIT"
--
grunt-contrib-concat/package.json:  "licenses": [
grunt-contrib-concat/package.json-    {
grunt-contrib-concat/package.json-      "type": "MIT",
grunt-contrib-concat/package.json-      "url": "https://github.com/gruntjs/grunt-contrib-concat/blob/master/LICENSE-MIT"
--

更新:

如果您希望查看所有模块的名称,即使是嵌套在其他模块中的模块,也可以使用以下方法(信任 @robertklep,稍作修改以在 node_modules 目录中仍然有效):

find * -name package.json | xargs grep '"license[s]*"' -A 3

【讨论】:

  • 虽然不会显示任何嵌套模块。 find node_modules -name package.json | xargs grep ... 怎么样?
  • @robertklep true,我会将您的变体添加到答案中。我的想法是,如果许可证是病毒式的(例如 GPL),则依赖于它的模块必须具有兼容的许可证。那应该不需要检查嵌套模块吧?
  • 我不知道@whadar 不能使用哪些许可证,尽管我认为您对 GPL 的假设是正确的。但是 MIT 许可的模块可以将 GPL 许可的模块列为依赖项,如果需要特定版本,我认为它将作为嵌套模块安装。
  • 这是一个危险的答案。这不应该被标记为答案,也不应该被使用。如果您的模块的许可证位于模块的其他部分,这将 1) 不拾取 2) 不会提醒您找不到该模块的许可证。不要使用这个。
【解决方案3】:

Yarn 也有这个命令。 yarn licenses list 呈现简短的输出,yarn licenses generate-disclaimer 将所有实际许可文本呈现到标准输出(适用于免责声明,正如选项所暗示的那样)。

  • 如果你想省略devDependencies

    NODE_ENV=production yarn licenses list
    
  • 出于我的目的,以下命令让我足够接近:

    yarn licenses list | grep License | \
    grep -vE 'MIT|ISC|WTFPL|BSD|Apache|Unlicense|CC-BY|Public Domain'`
    

【讨论】:

【解决方案4】:

【讨论】:

    【解决方案5】:

    刚刚为一个大型项目完成了这项工作,我可以说这个过程完全自动化比您想象的更令人头疼。使用此处列出的一些技巧很容易获得其中的许多,但 NPM 包许可证的发布并不一致,并且可能会出现

    • 在 NPM package.json 文件中,或
    • 在 README 文件中(有时只是名称,如“MIT 许可证”,有时在一个部分中包含完整的许可证文本),或
    • 在单独的 LICENSE 或 COPYING 文件中。

    此外,您有时必须阅读许可证才能知道它对应于哪个知名开源许可证。

    我所知道的最好的工具是 licensecheck 包(与此处的其他一些答案不同)涵盖所有这些情况: https://github.com/marcello3d/node-licensecheck

    它会查看 package.json 以及常见的许可证文件,并与已知许可证进行签名匹配,因此它可以准确地自动识别更多许可证。它还根据标准 SPDX 许可证列表 (https://spdx.org/licenses/) “规范化”许可证。

    最后,Licensecheck 还允许您将需要手动验证的任何剩余包保存在自己的 license.json 文件中(因为您不能指望外部维护者更改他们的包)。

    综合起来,这是一个非常强大的解决方案。

    【讨论】:

    • 最新版本似乎不输出 SPDX 标识符。
    【解决方案6】:

    我喜欢这个问题,并花时间为它编写了一个 nodejs 脚本:

    var npm = require('npm');
    npm.load(process.config,function(err){
        npm.list(function(err,deps){
            var names = Object.keys(deps.dependencies);
            for(var i in names){
                var depen = deps.dependencies[names[i]];
                console.log('Licenses for :',names[i]);
                depen.licenses.forEach(function(license,i){
                    console.log('License #'+(i+1));
                    console.log('- Title:',license.type);
                    console.log('- Url:\t',license.url);
                });
            }
        });
    });
    

    这将输出每个模块的每个许可证名称和 url,

    注意: 必须在项目文件夹中执行,并且必须安装 npm(npm install npm -g 听起来有点矫枉过正,但这是 npm js 库)

    【讨论】:

      【解决方案7】:

      您可以在基于 Linux 的系统上尝试一下:

      npm list -g --depth=0 | awk '{print $2}' | xargs -i npm view {} | grep license
      

      你会得到这样的东西:

        license: 'MIT',
        license: 'MIT',
        license: 'MIT',
        license: 'BSD',
        license: 'MIT',
        license: 'MIT',
        license: 'BSD-2-Clause',
        license: 'MIT',
        .....................
        .....................
        .....................
        license: 'BSD-2-Clause',
      

      【讨论】:

        【解决方案8】:

        如果您想从一个目录或其子目录中获取所有许可证,您可以使用 NPM License Crawler https://www.npmjs.com/package/npm-license-crawler。这对我来说是最好的解决方案

        【讨论】:

          【解决方案9】:

          如果您使用的是 Atom,则可以通过 npm-license-checkerpackage.json 获取许可证。

          【讨论】:

            【解决方案10】:

            快速简便的检查方法:

            npx license-checker --summary

            更多信息的重要来源:https://medium.com/@fokusman/the-easiest-way-to-check-all-your-npm-dependency-licenses-753075ef1d9d

            【讨论】:

              猜你喜欢
              • 2012-03-05
              • 2012-12-08
              • 2019-12-24
              • 2017-05-18
              • 2011-01-27
              • 2014-04-17
              • 2013-07-20
              • 2021-02-28
              • 1970-01-01
              相关资源
              最近更新 更多