2013-02-02 236 views
64

我有一些“全局”依赖项(jshint,csslint,buster等),我想通过命令行自动安装并执行,当我的包通过npm install安装。这可能吗?通过package.json安装“全局”npm依赖关系

目前,我做如下手动:

  1. npm install -g <package_name>
  2. 从我的项目中:npm link <package_name>

更新: 跨越this feature request刚来到了故宫。看起来像package.json中的scripts配置是要走的路?

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

回答

42

package.json无法指定依赖关系为“全局”。而且,这是由Isaac设计的states in that feature request你引用:

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

但是,在本地安装软件包时仍然可以使用“二进制文件”。他们将在.../node_modules/.bin/。而且,您应该能够将它们排列在preinstall script之间。

不过,如果该系列的命令是相当长的(如“jshint,csslint,终结者等。”所暗示的),你可能要考虑使用一个构建工具,如grunt执行各种任务:

{ 
    // ..., 

    "scripts": { 
     "preinstall": "grunt" 
    } 
} 
+0

谢谢@Jonathan。我想你是正确的。我目前有一个叫做'install'的咕task任务来处理构建modernizr,jquery等。并将随机文件复制到我的lib文件夹中。这意味着开发人员需要自己安装全局程序包,但是不管怎样,这应该不是我应用程序的问题。 – uglymunky

+1

您的应用应该记录其依赖关系,并且在我看来,确保它们以某种方式存在。 – EndangeredMassa

+3

https://www.npmjs.org/doc/misc/npm-scripts.html表示使用安装脚本是一种反模式。 – Fdr

25

我真的很喜欢您安装本地依赖性,然后使用bash脚本,设置路径,以./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 "[email protected]" 

然后,您可以在任何bash命令之前使用这个脚本。如果一对同一个Makefile文件或NPM脚本:

Makefile的文件

lint : 
    ./env.sh csslint my_styles 

文件:的package.json

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

此任务在这些文件中的样子,他们引用csslint在某些全局位置,但他们实际上在您的node_modules bin中使用了该版本。

真正令人敬畏的好处是,这些依赖关系可以很容易地进行版本控制,就像其他节点模块一样。如果你坚持使用全球安装解决方案,那么你可能会在用户系统上破坏某个其他项目所需的特定版本。

+1

您是否可以详细说明为什么每次要调用'./ node_modules/.bin /'命令时都使用脚本来设置路径?在你的例子中,每次运行'lint'时,即使它已经存在,你也会在路径中加上'./ node_modules/.bin'。为什么不直接在个人资料中设置路径?如果该命令不存在,shell将继续查看'$ PATH'的其余部分。 – N13

+1

我希望这可以被任何人使用。我可以将其设置在我的个人资料中,这对我很有用,但那些想要在这个模块上工作的人都必须这样做。请注意,package.json脚本中不再需要'./env.sh'。 – EndangeredMassa

+2

我还是不明白你为什么要设置'PATH'。如果所有'./ node_modules/.bin /'命令都通过'env.sh'路由,那为什么还要用PATH呢? 'exec ./node_modules/.bin/$ @'不够吗? – N13

7

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

我一直在使用它来直接从安装的package.json全球NPM包。对于没有技术知识的客户来说,它效果很好。

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

相关问题