【问题标题】:Installing "global" npm dependencies via package.json [duplicate]通过 package.json 安装“全局”npm 依赖项 [重复]
【发布时间】:2013-01-17 09:46:15
【问题描述】:

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

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

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

更新: 刚刚遇到this feature request 用于 npm。似乎 package.json 中的 scripts 配置是要走的路?

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

【问题讨论】:

    标签: node.js package npm


    【解决方案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 包。它非常适合不懂技术的客户。

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

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 2016-08-02
      • 1970-01-01
      • 2011-08-24
      • 2014-06-06
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多