通过 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 进行路由,那么为什么还要使用PATHexec ./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 依赖项 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 package.json 在全局和本地安装依赖项

npm安装卸载命令

利用npm 安装删除模块

利用npm 安装删除模块

利用npm 安装删除模块

node 通过指令创建一个package.json文件及npm安装package.json