NPM许可证检查器--license-checker

230 阅读5分钟

一、 功能概述

  • license-checker是一个用于检查软件项目中所使用的第三方库(或称为依赖项)的许可证(license)信息的工具。在软件开发过程中,特别是涉及到多个开源或第三方组件时,了解这些组件的许可证是非常重要的。因为不同的许可证对软件的使用、分发、修改等方面有不同的规定。

  • 例如,一些许可证(如 MIT 许可证)相对宽松,允许在几乎没有限制的情况下使用、修改和分发代码;而另一些许可证(如 GPL 许可证)则有更严格的规定,如要求使用了该代码的项目也必须以相同的许可证开源。license-checker可以帮助开发者快速、准确地获取项目中所有依赖的许可证信息,从而确保项目在法律和合规性方面没有问题。

二、 使用场景

  • 合规性检查

    • 企业或组织在开发软件产品时,需要确保其使用的所有第三方库都符合公司的合规政策和法律要求。license-checker可以帮助他们系统地检查每个依赖的许可证,避免因使用了具有限制条件的许可证而导致法律风险。
  • 开源项目维护

    • 开源项目的维护者可以使用这个工具来检查项目所依赖的库的许可证,以确保项目本身的许可证与依赖的许可证兼容。例如,如果一个开源项目的许可证是 Apache 2.0,它所依赖的库不能有与 Apache 2.0 不兼容的许可证,否则可能会影响项目的分发和使用。
  • 安全审计

    • 许可证信息也与软件安全有关。一些许可证可能要求对代码进行安全审计或者限制在某些安全敏感领域的使用。通过license-checker可以筛选出可能存在安全隐患的许可证类型的依赖,进而进行更深入的安全检查。

三、主要参数和使用方式

  • 安装方式

    • 通常是通过npm(Node Package Manager)进行安装。如果要全局安装,可以在命令行中运行npm install -g license-checker;如果只想在特定项目中安装,可以在项目目录下运行npm install license-checker
  • 基本参数使用

    • --production:这个参数非常有用,它告诉license-checker只检查package.json文件中的dependencies部分,即生产环境所需要的依赖的许可证信息,而忽略devDependencies(开发环境依赖)。例如,license-checker --production
    • --development 只显示开发依赖。
    • --csv:指定输出格式为 CSV(逗号分隔值)。这种格式很方便用于数据处理和存储,例如可以很容易地将结果导入到电子表格软件(如 Excel)中进行分析。命令示例:license-checker --production --csv
    • --json 输出JSON格式。
    • --out [文件名]:用于指定输出文件的名称和路径。例如,license-checker --production --csv --out license.csv会将许可证检查结果以 CSV 格式输出到名为license.csv的文件中。
    • --start [路径 - 初始JSON查找的位置]
    • --unknown 报告猜到的许可证作为未知许可证。
    • --onlyunknown 只列出具有未知或推测出许可证的包。
    • --csvComponentPrefix CSV格式中组件列的前缀。
    • --customPath 添加自定义格式的JSON文件。
    • --exclude [列表] 排除输出中的逗号分隔的许可证列表内的模块。
    • --relativeLicensePath 以相对路径输出许可证文件位置。
    • --summary 输出许可证使用的摘要。
    • --failOn [列表] 遇到第一个出现的分号分隔的许可证列表中的许可证时失败(退出代码1)。
    • --onlyAllow [列表] 遇到不在分号分隔的列表中的许可证的第一个出现时失败(退出代码1)。
    • --packages [列表] 限制输出到分号分隔的包(package@version)列表中。
    • --excludePackages [列表] 限制输出不包括在分号分隔的列表中的包(package@version)。
    • --excludePrivatePackages 限制输出不包含标记为私有的包。
    • --direct 仅查找直接依赖项。
  • 示例:

    license-checker --json > /path/to/licenses.json
    license-checker --csv --out /path/to/licenses.csv
    license-checker --unknown
    license-checker --customPath customFormatExample.json
    license-checker --exclude 'MIT, MIT OR X11, BSD, ISC'
    license-checker --packages 'react@16.3.0;react-dom@16.3.0;lodash@4.3.1'
    license-checker --excludePackages 'internal-1;internal-2'
    license-checker --onlyunknown
    
  • 自定义格式

使用--customPath选项可以与CSV一起指定列。请注意,第一列module_name始终会被使用。

当用于JSON格式时,它将在常规项目上添加所指定的条目。

可用的项如下:

-   name
-   version
-   description
-   repository
-   publisher
-   email
-   url
-   licenses
-   licenseFile
-   licenseText
-   licenseModified

还可以为每个项目提供默认值。 参见customFormatExample.json中的示例。

  • 调用
var checker = require('license-checker');
checker.init({ 
    start: '/path/to/start/looking' 
}, function(err, packages) { 
    if (err) { //处理错误 } 
    else { //按对象排序的包数据 } 
});
  • 调试 license-checker使用debug进行内部日志记录。有两个内部标记:

    • license-checker:error 用于错误
    • license-checker:log 用于非错误消息

设置DEBUG环境变量为这些之一来查看调试输出:

$ export DEBUG=license-checker*; license-checker
scanning ./yui-lint
├─ cli@0.4.3
│  ├─ repository: http://github.com/chriso/cli
│  └─ licenses: MIT
# ...
  • 如何找到许可证

使用read-installed模块遍历node_modules目录。一旦收集了模块列表,就会遍历它们并查看它们的所有package.json。尝试使用spdx模块识别有效的SPDX许可。如果该尝试失败,会查找模块中的以下文件:LICENSELICENCECOPYINGREADME

如果找到了这些文件中的一个(按照上述顺序),将尝试使用已知的许可证文本列表从中解析许可证数据。这会在许可证名称旁边显示*,表示"猜测"了许可证。

四、输出信息解读

  • license-checker运行后,它会输出每个依赖的相关信息,通常包括依赖的名称、版本和许可证类型。
  • 例如,在 CSV 格式的输出文件中,可能会有以下列:name(依赖名称)、version(版本号)和license(许可证类型)。这些信息可以帮助开发者快速了解每个依赖的许可证情况,以便进一步进行合规性评估。如果某个依赖的许可证类型不明确或者存在潜在风险,开发者可以根据这些信息去查看该依赖的官方文档或者源代码仓库来获取更详细的许可证条款。

参考文献:gitcode.com/gh_mirrors/…