45

我有一个刚开始使用的节点应用程序,每次尝试运行它时,它都会说缺少一个模块。我一直在使用npm install ...每个模块,但是在做了大约 10 个之后,我想知道是否有一种方法可以让 npm 下拉节点应用程序所需的所有模块,而无需我手动安装每个模块。可以做到吗?

4

5 回答 5

82

是的,只要依赖项列在package.json.

在包含 的目录中package.json,只需键入:

npm install
于 2012-11-02T05:21:52.983 回答
16

我创建了一个 npm 模块来处理自动安装缺少的模块。

npm-安装-缺失

它将自动安装所有应用程序依赖项和子依赖项。当子模块未正确安装时,这很有用。

于 2013-11-12T16:49:04.070 回答
4

您可以运行npm install yourModule --save以安装并package.json使用这个新安装的模块自动更新。

因此,当您npm install第二次运行时,它将安装先前添加的每个依赖项,您无需逐个重新安装每个依赖项。

于 2012-11-03T03:27:13.073 回答
1

我为此写了一个脚本。
将它放在脚本的开头,当你运行它时,所有卸载的模块都会被安装。

(function () {
  var r = require
  require = function (n) {
    try {
      return r(n)
    } catch (e) {
      console.log(`Module "${n}" was not found and will be installed`)
      r('child_process').exec(`npm i ${n}`, function (err, body) {
        if (err) {
          console.log(`Module "${n}" could not be installed. Try again or install manually`)
          console.log(body)
          exit(1)
        } else {
          console.log(`Module "${n}" was installed. Will try to require again`)
          try{
            return r(n)
          } catch (e) {
            console.log(`Module "${n}" could not be required. Please restart the app`)
            console.log(e)
            exit(1)
          }
        }
      })
    }
  }
})()
于 2014-02-03T10:37:38.100 回答
1

我受到@Aminadav Glickshtein 的回答的启发,创建了一个我自己的脚本来同步安装所需的模块,因为他的回答缺乏这些功能。

我需要一些帮助,所以我在这里开始了一个 SO 问题。您可以在那里阅读有关此脚本如何工作的信息。
结果如下:

const cp = require('child_process')

const req = async module => {
  try {
    require.resolve(module)
  } catch (e) {
    console.log(`Could not resolve "${module}"\nInstalling`)
    cp.execSync(`npm install ${module}`)
    await setImmediate(() => {})
    console.log(`"${module}" has been installed`)
  }
  console.log(`Requiring "${module}"`)
  try {
    return require(module)
  } catch (e) {
    console.log(`Could not include "${module}". Restart the script`)
    process.exit(1)
  }
}

const main = async () => {
  const http    = await req('http')
  const path    = await req('path')
  const fs      = await req('fs')
  const express = await req('express')

  // The rest of the app's code goes here
}

main()

还有一个单行字(139 个字符!)。它没有全局定义child_modules,没有最后一个try-catch,也没有在控制台中记录任何内容:

const req=async m=>{let r=require;try{r.resolve(m)}catch(e){r('child_process').execSync('npm i '+m);await setImmediate(()=>{})}return r(m)}

const main = async () => {
  const http    = await req('http')
  const path    = await req('path')
  const fs      = await req('fs')
  const express = await req('express')

  // The rest of the app's code goes here
}

main()
于 2018-11-19T22:25:42.467 回答