如何安装 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" 前雇员或团队的一些代码没有记录并且由不相关的、不一致的文件组成。
无论如何,对于您的问题会有一些解决方案:
糟糕的解决方案:运行 npm start
并查看您收到的错误消息。将找不到所有已卸载的依赖项,因此您将看到包名称并可以手动将它们添加到您的 package.json
。这将变得很糟糕,因为您每次都必须重新 运行 您的程序。为避免这种情况,您可以查看 Nodemon,它会自动重新启动您的程序。
更好的解决方案:打开一个你喜欢的网站IDE,然后使用"Global Search"函数查找所有出现的字符串require(
,或者作为一个正则表达式:require\((.+)\)
。这将列出您程序文件中的所有依赖项导入。如果还应该有 ECMA 6 导入,也搜索 import (.+) from (.+)
。 - 但是,您仍然需要手动将所有文件中的所有依赖项名称复制并粘贴到您的 package.json
文件中。
最好但最复杂的解决方案:编写一个 Node.js 脚本 scans all your files recursively,从项目根目录开始。创建一个依赖内存变量,如 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]);
}
}
});
您可以扫描您的项目以查找所有必需的模块。
假设您的项目仅使用 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 的家庭作业。
我对 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" 前雇员或团队的一些代码没有记录并且由不相关的、不一致的文件组成。
无论如何,对于您的问题会有一些解决方案:
糟糕的解决方案:运行
npm start
并查看您收到的错误消息。将找不到所有已卸载的依赖项,因此您将看到包名称并可以手动将它们添加到您的package.json
。这将变得很糟糕,因为您每次都必须重新 运行 您的程序。为避免这种情况,您可以查看 Nodemon,它会自动重新启动您的程序。更好的解决方案:打开一个你喜欢的网站IDE,然后使用"Global Search"函数查找所有出现的字符串
require(
,或者作为一个正则表达式:require\((.+)\)
。这将列出您程序文件中的所有依赖项导入。如果还应该有 ECMA 6 导入,也搜索import (.+) from (.+)
。 - 但是,您仍然需要手动将所有文件中的所有依赖项名称复制并粘贴到您的package.json
文件中。最好但最复杂的解决方案:编写一个 Node.js 脚本 scans all your files recursively,从项目根目录开始。创建一个依赖内存变量,如
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]);
}
}
});
您可以扫描您的项目以查找所有必需的模块。
假设您的项目仅使用 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 的家庭作业。