我受到@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()