如何安装 package.json 中没有的 npm 依赖项?

How to install npm dependencies which aren't in package.json?

我对 npm install 有疑问。我想安装我的项目中使用的所有依赖项。在 package.json 中没有任何依赖关系,但是在我的项目文件中有例如 const mongo=require('mongoose') 和另一个文件 const morgan=require('morgan')

我知道在输入 npm i --save <dependency_name> 时它会更新我的 package.json。但是我想安装所有依赖项而不在任何地方显式输入它们的名称。

有没有办法安装整个项目中使用的所有依赖项,但 package.json 中没有?

不,您不能那样做 - 您必须通过显式安装来添加所有依赖项,例如 npm install morgan。 NPM 不知道您在文件中导入的依赖项。另一件事是,要求 package.json 中未列出的依赖项是完全错误的,永远不应该发生。

简答:你不能

npm install 的工作原理是检查 package.json 中列出的所有依赖项并一次性安装它们。所以要么你从导师那里得到package.json,要么你一个一个安装

不打算先写你的程序代码,然后让NPM找到所有使用的依赖项。这是因为一个简单的原因:在你使用外部库/包之前,你必须下载它,否则你根本无法使用它。

现在,我只看到您的用例有两个原因:

  • 您在没有所有文件的地方复制并粘贴了一些外国代码,尤其是没有 package.json,或者
  • 你 "inherited" 前雇员或团队的一些代码没有记录并且由不相关的、不一致的文件组成。

无论如何,对于您的问题会有一些解决方案:

  1. 糟糕的解决方案:运行 npm start 并查看您收到的错误消息。将找不到所有已卸载的依赖项,因此您将看到包名称并可以手动将它们添加到您的 package.json。这将变得很糟糕,因为您每次都必须重新 运行 您的程序。为避免这种情况,您可以查看 Nodemon,它会自动重新启动您的程序。

  2. 更好的解决方案:打开一个你喜欢的网站IDE,然后使用"Global Search"函数查找所有出现的字符串require(,或者作为一个正则表达式:require\((.+)\)。这将列出您程序文件中的所有依赖项导入。如果还应该有 ECMA 6 导入,也搜索 import (.+) from (.+)。 - 但是,您仍然需要手动将所有文件中的所有依赖项名称复制并粘贴到您的 package.json 文件中。

  3. 最好但最复杂的解决方案:编写一个 Node.js 脚本 scans all your files recursively,从项目根目录开始。创建一个依赖内存变量,如 let dependencies = []。读取所有 *.js 文件(同步或异步),每次匹配 requireimport 语句时,检查依赖项是否已在您的 dependencies 数组中。如果没有,请推动它。最后,您所有的项目依赖项都将列在 dependencies 数组中,您可以将它们复制并粘贴到您的 package.json.

伪Node.js代码:

const lineReader = require('line-reader');

let dependencies = [];
const regex = /require\(['|"](.+)['|"]\)/g;

lineReader.eachLine('/path/to/file', function(line) {
  const match = regex.exec(line);
  if(match) {
    if(dependencies.indexOf(match[1]) === -1) {
      dependencies.push(match[1]);
    }
  }
});

您可以扫描您的项目以查找所有必需的模块。

假设您的项目仅使用 common.js(要求),您可以通过执行以下操作来获取所有模块的列表:

egrep -R --exclude-dir=node_modules '=\s*require\s*\(' | awk '{gsub(/^.+require\s*\(\s*./,""); gsub(/.\s*\).*$/,""); print [=10=]}'

上述命令的可读性更好的版本是:

#! /bin/bash
egrep -R --exclude-dir=node_modules '=\s*require\s*\(' |
    awk '{
        gsub(/^.+require\s*\(\s*./,"");
        gsub(/.\s*\).*$/,"");
        print [=11=]
    }'

您可以将上面的脚本保存在文件中并作为 shell 脚本执行。

要自动安装模块,只需将其通过管道传输到 xargs:

egrep -R --exclude-dir=node_modules '=\s*require\s*\(' |
    awk '{
        gsub(/^.+require\s*\(\s*./,"");
        gsub(/.\s*\).*$/,"");
        print [=12=]
    }' |
    xargs npm install

我将支持 ES6 模块留作 reader 的家庭作业。