【问题标题】:Is installing things globally from npm a bad practice?从 npm 全局安装东西是一种不好的做法吗?
【发布时间】:2016-10-03 14:07:44
【问题描述】:

我是这里的 npm 新手,所以也许我什么都不懂。我知道 npm 可以将模块安装在项目本地的 npm_modules 目录中,或者使用 --global 可以将其安装在机器范围的位置。

除了临时方便之外,您为什么要全局安装任何软件包?例如,我看到了各种各样的 npm 配置/设置,它们会在全球范围内安装 typescript。但如果我的机器上有 5 个项目,其中 3 个使用不同版本的打字稿,那就不好了……对吧?

我的包管理经验来自 Java/Maven 世界,其中所有模块都安装在全局位置 (~/.m2/repository),但要引用任何内容(作为 cmd/tool/plugin 或作为依赖项)您需要指定版本号。因此,您可以两全其美——消除重复的软件包安装和完全可重现的构建。我原以为 npm 会以自己的方式完成同样的事情。

我错过了什么?

【问题讨论】:

标签: npm npm-install toolchain


【解决方案1】:

如果你正在使用多种工具来转换你的代码(Typescript、webpack、babel)并且你打算在本地使用不同的包并将它们链接在一起,我绝对不建议在全局安装东西,你会遭受很多更新任何全局组件。甚至 webpack 团队discourage 全局安装第二版:

webpack 命令现在全球可用。

但是,这不是推荐的做法。这会将您锁定到特定版本的 webpack,并且可能会在使用不同版本的项目中失败。

【讨论】:

    【解决方案2】:

    npm 1.0 release notes 阐明了这一理由:

    一般来说,经验法则是:

    1. 如果您正在安装要在您的程序中使用的东西, 使用 require('whatever'),然后在本地安装它的根目录 你的项目。
    2. 如果您要安装要在其中使用的东西 你的 shell,在命令行或其他地方,全局安装它,所以 它的二进制文件最终会出现在您的 PATH 环境变量中。

    【讨论】:

    • 我认为这总结了它的当前使用状态。但是就像@jwenting 回答一样,我们不是在这里假设不同版本的工具不会产生不同的最终工件。 tsc v1.8 是否 100% 保证产生与 tsc v2.0 相同的输出?或者我只是一个书呆子,因为最终,我们有一个 CI 服务器拥有最终决定权....
    • 也许,但迂腐通常可以成为软件开发中的一项资产。就您的观点而言:您绝对不能保证任何工具或模块的不同主要版本都会产生相同的输出。如果您有全局安装的工具(例如tsc),只需在您的 CI 中添加一个步骤,以某个合理的时间间隔更新或同步您的模块版本。在实践中,我从来没有遇到过与此类问题相关的隐形构建问题。对于错误,您的测试(或 tsc 本身)将/应该大声抱怨并非常清楚地指出问题。
    【解决方案3】:

    Maven 不会在全局范围内安装任何内容。它保留一个本地“全局”存储库,以防止必须为每个新构建下载所有内容,但每个项目都有自己在其 pom 文件中定义的所有库的版本。

    对于 npm,通常您会在全局范围内使用它安装一些工具,例如 grunt-cli 和 karma-cli,然后在每个项目的 package.json 中定义该项目在哪个版本中需要哪些模块/库。

    【讨论】:

    • 但是假设我使用 1.0 版本全局安装 karma-cli,而您使用 2.0 全局安装它,而我们的 CI 服务器使用 3.0 版本。当我们运行它时,我们不会得到不同的结果吗?我知道它只是一个工具,但某些工具版本会产生不同的结果。
    猜你喜欢
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2010-12-29
    • 2014-05-30
    • 2020-07-31
    • 2014-11-02
    • 1970-01-01
    相关资源
    最近更新 更多