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

时间:2019-09-05 08:09:36

标签: javascript node.js npm npm-install

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

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

是否可以安装整个项目中使用的所有依赖项,但是package.json中没有?

4 个答案:

答案 0 :(得分:1)

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

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

  • 您复制并粘贴了一些没有所有文件的外部代码,尤其是没有package.json的文件,或者
  • 您“继承”了前雇员或团队的一些未记录的代码,这些代码由不相关且不一致的文件组成。

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

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

  2. 更好的解决方案:打开您喜欢的Web IDE,然后使用“全局搜索”功能查找所有出现的字符串require(或正则表达式:require\((.+)\)。这将在程序文件中列出所有依赖项导入。如果还应该导入ECMA 6,则也搜索import (.+) from (.+)。 -但是,您仍然必须将所有文件中的所有依赖项名称手动复制并粘贴到package.json文件中。

  3. 最好但最复杂的解决方案:从根项目目录开始,编写一个scans all your files recursively的Node.js脚本。创建一个依赖项存储变量,例如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]);
    }
  }
});

答案 1 :(得分:0)

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

答案 2 :(得分:0)

简短的回答:您不能

npm install的工作方式是检查package.json中列出的所有依赖项,并一次安装它们。因此,您可以从导师那里获得package.json,也可以一个一个地安装它们

答案 3 :(得分:0)

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

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

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

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

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

您可以将上面的脚本保存在文件中,然后将其作为Shell脚本执行。

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

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

我将支持ES6模块留给读者作为作业。