【问题标题】:How to install npm dependencies which aren't in package.json?如何安装不在 package.json 中的 npm 依赖项?
【发布时间】:2019-09-05 08:09:36
【问题描述】:

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

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

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

【问题讨论】:

  • 使用命令npm i morgan --save。这将安装依赖项并在 package.json 中创建条目
  • 为什么package.json中没有他们?
  • @jonrsharpe 我现在正在做 turorial,我正在考虑这个问题。在本教程中一步有install all dependencies
  • 什么教程?关于如何这样做的说明是怎么说的?

标签: javascript node.js npm npm-install


【解决方案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 文件(同步或异步),每次匹配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]);
    }
  }
});

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      简短回答:你不能

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

      【讨论】:

        【解决方案4】:

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

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

        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 模块留给读者作为家庭作业。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-02
          • 2015-07-25
          • 1970-01-01
          • 1970-01-01
          • 2013-01-17
          • 1970-01-01
          • 2017-04-18
          • 1970-01-01
          相关资源
          最近更新 更多