通过package.json安装“全局”npm依赖项

时间:2013-02-02 00:12:01

标签: node.js package npm

我有一些“全局”依赖项(jshint,csslint,buster等),当我的程序包通过npm install安装时,我希望通过命令行自动安装和执行。这可能吗?

目前,我正在手动执行以下操作:

  1. npm install -g <package_name>
  2. 来自我的项目:npm link <package_name>
  3. 更新: 刚刚遇到this feature request npm。似乎package.json中的scripts配置是要走的路?

    再次更新: 或者,在阅读npm docs之后,也许我应该使用.gyp file?我很困惑。

3 个答案:

答案 0 :(得分:50)

无法将依赖关系指定为&#34; global&#34;来自package.json。而且,这是设计为您引用的Isaac states in that feature request

  

是的,我们永远不会这样做。

但是,&#34;二进制文件&#34;在本地安装软件包时仍可使用他们将在.../node_modules/.bin/。而且,您应该能够使用preinstall script排队。

但是,如果一系列命令相当冗长(如#34; jshint,csslint,buster等...... &#34;会建议),你可能想看一下使用诸如grunt之类的构建工具来执行各种任务:

{
    // ...,

    "scripts": {
        "preinstall": "grunt"
    }
}

答案 1 :(得分:28)

我非常喜欢您安装本地依赖项的模式,然后使用将您的PATH设置为./node_modules/.bin的bash脚本。

文件: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脚本配对:

文件:Makefile

lint :
    ./env.sh csslint my_styles

文件:package.json

"scripts": {
  "lint": "./env.sh csslint my_styles"
}

这些文件中的任务看起来像是在某个全局位置引用csslint,但它们实际上使用了node_modules bin中的版本。

这样做的真正好处是可以轻松地对这些依赖项进行版本控制,就像其他节点模块一样。如果您坚持使用全局安装解决方案,那么您可能会破坏用户系统上某个其他项目所需的特定版本。

答案 2 :(得分:8)

你应该试试这个:https://github.com/lastboy/package-script

我一直用它来直接从package.json安装全局npm包。它适用于技术水平不高的客户。

它甚至会检查软件包是否已安装,如果没有安装它们的话!