Node.js npm安装由于权限原因,未在Ubuntu上安装递归依赖项 问题描述

Node.js npm安装由于权限原因,未在Ubuntu上安装递归依赖项 问题描述,node.js,permissions,npm,Node.js,Permissions,Npm,当使用sudo npm install从package.json在Ubuntu服务器上安装npm软件包时,许多依赖项都没有安装。在本地运行npm install会按预期安装所有内容。该问题似乎是由节点\u modules/目录中的权限问题引起的。如何确保npm能够递归安装所有依赖项 背景 我正在将NodeJS应用程序部署到Ubuntu Web服务器。我的所有包都是在我的package.json文件中定义的,如下所示: { "name": "MyApp", "engines": {

当使用
sudo npm install
package.json
在Ubuntu服务器上安装
npm
软件包时,许多依赖项都没有安装。在本地运行
npm install
会按预期安装所有内容。该问题似乎是由
节点\u modules/
目录中的权限问题引起的。如何确保
npm
能够递归安装所有依赖项

背景 我正在将NodeJS应用程序部署到Ubuntu Web服务器。我的所有包都是在我的
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
立即启动节点服务器,而不会出现任何问题(在运行所有任务/预编译作业之后)

在服务器上运行
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)

然而,这违背了包.json的全部目的,更不用说每次新部署都需要大量维护。

不要使用sudo。应用程序的依赖项不需要在系统范围内安装。因此,在服务器上的某个普通目录中安装应用程序代码,然后将
cd
安装到该目录中,并作为普通用户(而不是root用户)运行
npm install
,而不使用sudo。npm将把你的应用程序的所有依赖项(完全递归)放到
节点\u modules
子目录中,你应该准备好了。我不清楚为什么sudo会让你失败,但这从来都不是一个好主意。请记住,这是从Internet下载脚本并以root用户身份运行它们,因为npm软件包可能有安装脚本。当以root用户身份运行时,会有很多额外的风险。

问题的解决方案是在没有
sudo
的情况下重新安装软件包,如果遇到任何问题,请修复相关文件/操作的权限,以便
npm install
仍然有效。谢谢
$ sudo npm install express
...