Possible to install all missing modules for a node

2020-05-15 15:11发布

问题:

I have a node app that I just started working with and each time I try to run it, it says there is a missing module. I've just been using npm install ... for each module but after doing about 10 of them I'm wondering if there is a way to have npm pull down all needed modules for a node app without me installing each one manually. Can it be done?

回答1:

Yes, as long as the dependency is listed in package.json.

In the directory that contains package.json, just type:

npm install


回答2:

I created an npm module to handle installing missing modules automatically.

npm-install-missing

It will install all app dependencies and sub-dependencies automatically. This is useful when submodules aren't installed correctly.



回答3:

You can run npm install yourModule --save in order to install and automatically update package.json with this newly installed module.

So when you run npm install a second time it will install every dependecy previously added and you won't need to reinstall every dependency one by one.



回答4:

I have written a script for this.
Place it at the start of your script, and any uninstalled modules will be installed when you run it.

(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)
          }
        }
      })
    }
  }
})()


回答5:

I was inspired by @Aminadav Glickshtein's answer to create a script of my own that would synchronously install the needed modules, because his answer lacks these capabilities.

I needed some help, so I started an SO question here. You can read about how this script works there.
The result is as follows:

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()

And a one-liner (139 characters!). It doesn't globally define child_modules, has no last try-catch and doesn't log anything in the console:

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()


标签: node.js npm