我对npm install
有疑问。我想安装项目中使用的所有依赖项。在package.json
中没有任何依赖关系,但是在我的项目文件中,例如,我有const mongo=require('mongoose')
,在另一个文件中,则是const morgan=require('morgan')
等。
我知道在键入npm i --save <dependency_name>
时会更新我的package.json
。但是我想安装所有依赖项,而不必在任何地方显式键入其名称。
是否可以安装整个项目中使用的所有依赖项,但是package.json
中没有?
答案 0 :(得分:1)
不打算先编写程序代码,然后让NPM查找所有使用的依赖项。这是由于一个简单的原因:在使用外部库/软件包之前,必须先下载它,否则根本无法使用它。
现在,我只看到两个用例的原因:
package.json
的文件,或者无论如何,针对您的问题会有一些解决方案:
讨厌的解决方案:运行npm start
,然后查看收到的错误消息。找不到所有已卸载的依赖项,因此您将看到软件包名称,并可以将其手动添加到您的package.json
中。这将变得很讨厌,因为您每次都必须重新运行程序。为避免这种情况,您可以查看Nodemon,它会自动重新启动程序。
更好的解决方案:打开您喜欢的Web IDE,然后使用“全局搜索”功能查找所有出现的字符串require(
或正则表达式:require\((.+)\)
。这将在程序文件中列出所有依赖项导入。如果还应该导入ECMA 6,则也搜索import (.+) from (.+)
。 -但是,您仍然必须将所有文件中的所有依赖项名称手动复制并粘贴到package.json
文件中。
最好但最复杂的解决方案:从根项目目录开始,编写一个scans all your files recursively的Node.js脚本。创建一个依赖项存储变量,例如let dependencies = []
。读取所有*.js
文件(同步文件或异步文件),并且每次匹配require
或import
语句时,请检查相关性是否已存在于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模块留给读者作为作业。