繁体   English   中英

由于权限,npm安装没有在Ubuntu上安装递归依赖项

[英]npm install not installing recursive dependencies on Ubuntu due to permissions

问题描述

使用sudo npm installpackage.json在Ubuntu服务器上安装npm软件包时,不会安装许多依赖项。 在本地运行npm install会按预期安装所有内容。 该问题似乎是由node_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)

解决方案是单独安装每个顶级软件包,然后正确获取并安装递归依赖项:

$ sudo npm install express
...

但是,这会破坏package.json的整个目的,更不用说每次新部署需要大量维护。

不要使用sudo。 您的应用程序的依赖项不需要在系统范围内安装。 因此,将您的应用程序代码安装在服务器上的某个普通目录中,然后cd进入该目录并以不带sudo的常规用户(非root用户身份)运行npm install npm会将你所有应用程序的依赖项(完全递归)放入node_modules子目录中,你应该很高兴。 不确定为什么sudo会让你失败,但这绝不是一个好主意。 请记住,从Internet下载脚本并以root身份运行它们,因为npm包可以安装脚本。 以root身份运行时会有很多额外的风险。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM