问题描述
当使用 sudo npm install
从 package.json
在 Ubuntu 服务器上安装 npm
包时,许多依赖项没有安装。在本地运行 npm install
会按预期安装所有内容。该问题似乎是由 node_modules/
目录中的权限问题引起的。如何确保 npm
能够递归安装所有依赖项?
背景
我正在将 NodeJS 应用程序部署到 Ubuntu 网络服务器。我的所有包都在我的 package.json
文件中定义,如下所示:
{
"name": "MyApp",
"engines": {
"node": "0.10.x",
"npm": "1.2.x"
},
"dependencies": {
"express": "~3.5.1",
"jade": "~1.3.1",
"mongoose": "3.8.8",
...
}
}
当我在本地运行 npm install
时,我能够立即使用 node server.js
启动 Node 服务器而没有任何问题(在运行所有任务/pre -编译作业)。
在服务器上运行 npm install
失败,由于像这样的 EACCES
错误:
npm ERR! error rolling back Error: EACCES, unlink '/myapp/staging/node_modules/.bin/express'
npm ERR! error rolling back express@3.5.1 { [Error: EACCES, unlink '/myapp/staging/node_modules/.bin/express']
npm ERR! error rolling back errno: 3,
npm ERR! error rolling back code: 'EACCES',
npm ERR! error rolling back path: '/myapp/staging/node_modules/.bin/express' }
npm ERR! Error: EACCES, unlink '/myapp/staging/node_modules/.bin/express'
npm ERR! { [Error: EACCES, unlink '/myapp/staging/node_modules/.bin/express']
npm ERR! errno: 3,
npm ERR! code: 'EACCES',
npm ERR! path: '/myapp/staging/node_modules/.bin/express' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.
当我在服务器上运行 sudo npm install
时(在删除 node_modules/
并运行 sudo npm cache clean
之后),npm
获取所有顶级包:
npm http GET https://registry.npmjs.org/jade
npm http GET https://registry.npmjs.org/mongoose
npm http GET https://registry.npmjs.org/express
...
但在安装依赖项时不使用 sudo
,因此它们会安静地失败而不会出现任何错误消息。结果是服务器启动失败:
$ node server.js
module.js:340
throw err;
^
Error: Cannot find module './lib/express'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (/myapp/node_modules/express/index.js:4:5)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
解决方案是单独安装每个顶级包,然后正确获取并安装递归依赖项:
$ sudo npm install express
...
然而,这违背了 package.json
的全部目的,更不用说每个新部署都需要大量维护。
最佳答案
不要使用 sudo。您的应用程序的依赖项不需要在系统范围内安装。因此,将您的应用程序代码安装在服务器上的某个普通目录中,然后 cd
进入该目录并以您的普通用户(而非 root)身份运行 npm install
而无需 sudo。 npm 会将您应用程序的所有依赖项(完全递归)放入 node_modules
子目录中,您应该可以开始了。不确定为什么使用 sudo
会失败,但这绝不是一个好主意。请记住,这是从 Internet 下载脚本并以 root 身份运行它们,因为 npm 包可以有安装脚本。以 root 身份运行时会有很多额外的风险。
关于node.js - 由于权限,npm install 未在 Ubuntu 上安装递归依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23071118/