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

ugl*_*nky 75 package node.js npm

我有一些"全局"依赖项(jshint,csslint,buster等),我希望通过命令行自动安装和执行我的软件包npm install.这可能吗?

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

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

更新:刚刚遇到这个 npm的功能请求.似乎scriptspackage.json中的配置是要走的路?

再次更新:或者,在阅读了npm文档之后,也许我应该使用.gyp文件?我糊涂了.

Jon*_*ski 52

不可能将依赖关系指定为"全局" package.json.而且,这是设计为Isaac 您引用的功能请求中声明的:

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

但是,当在本地安装软件包时,仍然可以使用"二进制文件".他们会在.../node_modules/.bin/.而且,您应该能够使用preinstall脚本排队.

但是,如果一系列命令相当冗长(如" jshint,csslint,buster等...... "),您可能需要考虑使用构建工具grunt来执行各种任务:

{
    // ...,

    "scripts": {
        "preinstall": "grunt"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果需要,可以将npm install -g添加到预安装脚本中. (4认同)
  • https://www.npmjs.org/doc/misc/npm-scripts.html表示安装脚本的使用是一种反模式. (3认同)

End*_*ssa 30

我非常喜欢您安装本地依赖项的模式,然后使用将您的PATH设置为的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 "$@"
Run Code Online (Sandbox Code Playgroud)

然后,您可以在任何bash命令之前使用此脚本.如果您将它与Makefile或npm脚本配对:

文件:Makefile

lint :
    ./env.sh csslint my_styles
Run Code Online (Sandbox Code Playgroud)

文件:package.json

"scripts": {
  "lint": "./env.sh csslint my_styles"
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我仍然不明白为什么你要设置`PATH`.如果所有`./ node_modules/.bin /`命令都通过`env.sh`路由,为什么还要使用`PATH`?不是`exec ./node_modules/.bin/$ @`足够吗? (2认同)

CMC*_*kai 8

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

我一直用它来直接从package.json安装全局的npm包.它适用于没有技术知识的客户.

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