Gulp 以编程方式获取NPM软件包的许可证

5vf7fwbs  于 2022-12-08  发布在  Gulp
关注(0)|答案(3)|浏览(235)

我有一个JS应用程序,我正在使用许多开源依赖项。我需要创建一个页面,其中包含每个包的许可证信息。我的应用程序目前能够从JSON文件中读取许可证列表并呈现它。我不想手动创建这个文件,因为它很乏味,而且很容易过时。幸运的是,所有的依赖项都列在我的package.json中,所以理论上应该很容易通过编程生成它,不幸的是我还没有找到一种方法。
看起来几乎所有的东西都在其仓库的根目录下有一个“LICENSE”文件,所以如果我有一个gulp脚本可以下载和处理这些文件,那就可以工作了。不幸的是,我一直无法找到一种方法来通过编程查询NPM的仓库地址。如何实现呢?

5m1hhzi4

5m1hhzi41#

AFAIK,npm软件包的发行商不需要提供许可证,或者至少不需要以标准的方式提供。
幸运的是,this package能够显示node_modules中所有软件包的许可证信息。它也有一个简单的API,所以获取信息并将其显示在网页上应该相当容易。

2j4z5cfb

2j4z5cfb3#

我已经这样做了,请随意修改它以适合您的用例(只需在项目目录(node getLicenses.js > LICENSES.txt)上使用节点运行它:

const FS = require('fs');

const packageJSON = JSON.parse(FS.readFileSync('package.json').toString());
const dependencies = packageJSON.dependencies;

const LICENSE_NAMES = [
  'LICENSE',
  'license',
  'LICENSE.md',
];

let FAILED_TO_FIND_LICENSES = false;

let libraries = Object.keys(dependencies);

libraries.forEach(key => {
  console.log('\n' + key);
  console.log('================================');

  const path = 'node_modules/' + key;

  let license = null;

  LICENSE_NAMES.forEach(name => {
    try {
      license = FS.readFileSync(path + '/' + name).toString();
    } catch (e) {}
  });

  if (!license) {
    try {
      let libraryPackageFile = FS.readFileSync(path + '/package.json').toString();
      // You can try to get the license from the package.json here
    } catch (e) {}
  }

  if (license) {
    console.log(license);
  } else {
    console.log('License not found');
    FAILED_TO_FIND_LICENSES = true;

    try { // This is to help update the LICENSE_NAMES before re-run it
      let files = FS.readdirSync(path);
      files.forEach(file => {
        console.log(file);
      });
    } catch (e) {}
  }
});

if (FAILED_TO_FIND_LICENSES) {
  console.error('WARN: The license for some dependencies was not found!');
}

相关问题