86

我有一些“全局”依赖项(jshint、csslint、buster 等),当我的包通过npm install. 这可能吗?

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

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

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

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

4

3 回答 3

58

无法从package.json. 而且,这是设计使然,正如 Isaac在您引用的功能请求中所述:

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

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

但是,如果一系列命令相当长(如“ jshint、csslint、buster 等”所建议的那样),您可能需要考虑使用构建工具grunt来执行各种任务:

{
    // ...,

    "scripts": {
        "preinstall": "grunt"
    }
}
于 2013-02-02T01:49:03.470 回答
35

我真的很喜欢安装本地依赖项的模式,然后使用 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 中的版本。

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

于 2013-02-02T02:08:19.687 回答
8

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

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

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

于 2013-09-30T23:27:09.993 回答