通过 package.json 安装“全局”npm 依赖项 [重复]
Posted
技术标签:
【中文标题】通过 package.json 安装“全局”npm 依赖项 [重复]【英文标题】:Installing "global" npm dependencies via package.json [duplicate] 【发布时间】:2013-01-17 09:46:15 【问题描述】:我有一些“全局”依赖项(jshint、csslint、buster 等),当我的包通过npm install
安装时,我希望通过命令行自动安装和执行这些依赖项。这可能吗?
目前,我正在手动执行以下操作:
npm install -g <package_name>
在我的项目中:npm link <package_name>
更新:
刚刚遇到this feature request 用于 npm。似乎 package.json 中的 scripts
配置是要走的路?
再次更新: 或者,在阅读了npm docs 之后,也许我应该使用.gyp file?我很困惑。
【问题讨论】:
【参考方案1】:无法从package.json
将依赖项指定为“全局”。而且,这是您引用的 Isaac states in that feature request 的设计:
是的,我们永远不会这样做。
但是,在本地安装软件包时,仍然可以使用“二进制文件”。他们将在.../node_modules/.bin/
。而且,您应该可以使用preinstall
script 将它们排队。
不过,如果一系列命令相当长(如“jshint、csslint、buster 等..”所建议的那样),您可能需要考虑使用诸如 @ 之类的构建工具987654323@ 执行各种任务:
// ...,
"scripts":
"preinstall": "grunt"
【讨论】:
感谢@Jonathan。我想你是正确的。我目前有一个名为install
的繁重任务,它处理构建modernizr、jquery 等并将随机文件复制到我的lib 文件夹。这意味着开发人员将需要自己安装全局包,但好吧,这不应该是我的应用程序关心的问题。
你的应用应该记录它的依赖关系,在我看来,确保它们以某种方式存在。
npmjs.org/doc/misc/npm-scripts.html 表示使用安装脚本是一种反模式。
如果需要,可以将 npm install -g 添加到预安装脚本中。【参考方案2】:
我非常喜欢安装本地依赖项的模式,然后使用 bash 脚本将 PATH 设置为 ./node_modules/.bin
。
文件:env.sh
# Add your local node_modules bin to the path for this command
export PATH="./node_modules/.bin:$PATH"
# execute the rest of the command
exec "$@"
然后,您可以在任何 bash 命令之前使用此脚本。如果你将它与 Makefile 或 npm 脚本配对:
文件:生成文件
lint :
./env.sh csslint my_styles
文件:package.json
"scripts":
"lint": "./env.sh csslint my_styles"
这些文件中的这些任务看起来像是在某个全局位置引用 csslint,但实际上它们使用的是您的 node_modules bin 中的版本。
这样做的真正好处是可以轻松地对这些依赖项进行版本控制,就像您的其他节点模块一样。如果您坚持使用全局安装解决方案,您可能会破坏用户系统上其他项目之一所需的某些特定版本。
【讨论】:
您能否详细说明每次要调用./node_modules/.bin/
命令时使用脚本设置路径的原因?在您的示例中,每次运行lint
时,您都会将./node_modules/.bin
添加到您的路径中,即使它已经存在。为什么不在您的个人资料中设置一次路径?如果该命令不存在,shell 将继续查找 $PATH
的其余部分。
我希望任何人都可以使用它。我可以在我的个人资料中设置它,它对我有用,但是其他想要在这个模块上工作的人都必须这样做。请注意,./env.sh
不再需要在 package.json scripts
中。
我还是不明白你为什么要设置PATH
。如果所有./node_modules/.bin/
命令都通过env.sh
进行路由,那么为什么还要使用PATH
? exec ./node_modules/.bin/$@
还不够吗?
@N13,这是不一样的,考虑到你可以有一些本地的二进制文件,一些全局的。因此,如果 all 箱是本地的,您的方法就足够了,但 PATH 方法允许您首先在本地找到二进制文件。话虽如此,我确实同意使用“env.sh”脚本似乎没有必要,只需将 PATH 导出添加到 bash profile/rc 脚本即可。
这对于 dotfiles repos 非常有用,您可以在其中轻松定义您期望在系统上的所有全局模块并提交它。感谢您分享这个想法!【参考方案3】:
你应该试试这个:https://github.com/lastboy/package-script
我一直在使用它直接从 package.json 安装全局 npm 包。它非常适合不懂技术的客户。
它甚至会检查包是否已经安装,如果没有安装它们!
【讨论】:
以上是关于通过 package.json 安装“全局”npm 依赖项 [重复]的主要内容,如果未能解决你的问题,请参考以下文章