2016-10-03 84 views
2

我是新来的npm,所以也许我没有得到。我知道npm可以将模块安装在项目本地的npm_modules目录中,或者使用--global可以将其安装在机器范围内的位置。从npm全球安装东西是一种不好的做法吗?

除了一些临时的方便之外,您为什么要在全球安装任何软件包?例如,我可以看到各种npm配置/设置,可以对全部打字稿进行安装。但是如果我在我的机器上有5个项目,其中3个使用不同版本的打字机,那不好...对吧?我的包管理经验来自Java/Maven世界,其中所有模块都安装在全局位置(〜/ .m2/repository),而是引用ANYING(作为cmd /工具/插件或作为依赖项)你需要指定版本号。因此,您可以获得两全其美的优势 - 消除重复的软件包安装和完美可重复的构建。我会认为npm会以它自己的方式完成同样的事情。

我错过了什么?

+2

是的,这是一个不好的做法。存储库级安装是首选。 –

+0

仅供参考 - 从本地存储库运行“工具”是可行的:http:// stackoverflow。com/questions/9679932/how-to-use-package-installed-locally-in-node-modules – HDave

回答

2

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


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

+0

但我们可以说我全局安装了1.0版本的karma-cli,并且它已经全局安装了2.0版本,我们的CI服务器使用版本3.0。我们运行它时不可能得到不同的结果吗?我知道它只是一个工具,但是某些工具版本会产生不同的结果。 – HDave

3

npm 1.0 release notes澄清这一理由:

一般来说,经验法则是:

  1. 如果你安装你想要在你的程序, 使用使用的东西require('whatever'),然后将其安装在您的项目的根目录 。
  2. 如果您正在安装要在 您外壳使用的东西,在命令行或某事上,全球安装它,所以 其二进制文件在PATH环境变量中结束。
+1

我认为这总结了它如何使用的当前状态。但就像@jwenting的回答一样,我们不是在这里假设不同版本的工具不会产生不同的最终工件。 tsc v1.8 100%保证产生与tsc v2.0相同的输出吗?或者我只是作为一个学生,因为最后,我们有一个CI服务器,有最后的发言权...... – HDave

+0

也许,但是pedantry往往是软件开发的资产。关于你的观点:你绝对不能保证任何工具或模块的不同主要版本都会产生相同的输出。如果您有全局安装的工具(如'tsc'),只需在您的配置项中添加一个步骤即可在合理的时间间隔内更新或同步您的模块版本。在实践中,我从来没有遇到与这类问题有关的无形构建问题。在错误的情况下,你的测试(或TSC本身)将/应该大声抱怨,并明确指出问题。 – msanford

5

如果您正在使用多个工具,用于将您的代码(打字稿,的WebPack,巴贝尔),你打算在本地用不同的包装工作,它们链接在一起,我绝对不会推荐在全球安装的东西,你更新任何全局组件时会受到很大影响。即使是组队的WebPack全球discourage安装第二个版本:

该命令的WebPack现已在全球范围。

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