通常情况下,我可以在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
)无法找到其中一个依赖项。
答案 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"