当版本与父模块相同时,节点不会安装子模块依赖项

时间:2014-04-24 13:19:57

标签: node.js heroku npm

通常情况下,我可以在Google上发现我遇到的任何问题,但在这种情况下,我完全不知道要搜索什么。

我的父模块有两个依赖项:

  • "grunt-contrib-uglify": "~0.2.7"
  • "node-snapshot": "~0.3.22"

但是,当node-snapshot也依赖于~0.2.7时,它不会安装在node-snapshot的{​​{1}}目录中。我的快照应用程序通过Travis自动部署到Heroku,因此具有:

node_modules

在我的父模块("scripts": { "test": "grunt test", "start": "node example/server/default.js", "postinstall": "node_modules/grunt-cli/bin/grunt build:production" } )中安装后也会调用它,但由于父和子都依赖于npm install node-snapshot而失败:

grunt-contrib-uglify ~0.2.7

如果父模块依赖>> Local Npm module "grunt-contrib-uglify" not found. Is it installed? Warning: Task "uglify" not found. Use --force to continue. 不同版本,那么grunt-contrib-uglify会在其node-snapshot目录中成功安装grunt-contrib-uglify,一切都很顺利-boo。

我将如何解决此问题?对我来说很明显,即使父模块具有相同的模块,所有子项都需要自己的安装,因为相对而言,子模块(node_modules)无法找到其中一个依赖项。

2 个答案:

答案 0 :(得分:3)

经过昨晚的一些研究,这显然是npm的一个已知问题。由于父模块已经满足特定的依赖关系,因此有很多关于未安装子模块依赖关系的线程。

GitHub上的以下主题非常有用:https://github.com/npm/npm/issues/5001

目前没有解决方案,但解决方法。

postinstall的特定情况下,解决方法是添加preinstall --ignore-scripts标记,以防止以递归方式调用scripts挂钩。这使npm install能够独立运行,从而安装所有依赖项,而不管父模块。

因此我的package.json现在看起来几乎完全相同,但使用preinstall挂钩:

"scripts": {
  "test": "grunt test",
  "start": "node example/server/default.js",
  "preinstall": "npm install --ignore-scripts",
  "postinstall": "bower install; grunt build:production"
}

答案 1 :(得分:0)

npm在没有帮助的情况下不会安装重复的模块。它也不需要运行脚本的路径。当你这样做时会发生什么:

"postinstall": "grunt build:production"