用nvm改变node版本的时候全局模块找不到

翻译 by peak 原文地址

如果你全局安装一个npm包my-package在你的电脑上,然后用nvm改变node的版本的时候,你将不能在全局范围内访问my-package.这是因为nvm安装全局模块到当前node版本的时候不会和其它版本共享.

nvm原理

当你安装一个全局的包(或者本地),假设这个包是兼容的并在那个node版本上经过测试.如果你改变了node的版本,并不能保证你安装的那个模块在当前的版本上是兼容个的.可能这个包在这个新的node版本上并没有经过测试.所以nvm要保持安装的全局包只针对特定的node版本.如果用户需要一些模块进行转发,他要么重新安装他们,要么使用--reinstall-packages-from参数.

现实问题

我同意nvm团队的理论.但是开发者很懒惰.如果他不得不一次又一次的手动在不同的node版本上安装像grunt,bower这样的包.它肯定会成为我的痛苦.因此,我个人需要以某种方式转发全局包

达到目标的方法

一种讨论最多的方法就是改变NPMCONFIGPREFIX环境变量来实现全局包.但是这种方式违背了nvm的实现原理,也不被nvm团队建议使用.我也面临同样的问题.所以最好避免这种情况,用下面的方式.
使用全局安装包的最简单的方法之一就是在安装node新版本的时候使用--reinstall-packages-from标识.这个方法和运行下面的代码一样简单

nvm install 7.6.0 --reinstall-packages-from=7.0.0
nvm use 7.6.0


上述方法将帮助你在安装一个新的node版本时重新安装包.但是,更多时候你需要频繁的切换版本.比如我同时需要ember-cli和angular-cli来工作.现在ember-cli需要在node6.9以下的版本工作.angular-cli需要在node6.9以上的版本工作.所以我常常要切换两个版本(6.2.1和6.9.5在我的情况下).现在如果我在我的6.9.5版本下安装了一个全局包并想在我切换版本的时候让他在6.2.1下的版本也能用.上面提到的方法并不能实现,因为我已经安装了6.2.1的版本.

避免这种情况的最好方式是,在使用nvm的时候而不是安装nvm的时候使用--reinstall-packages-from标识.但遗憾的是,use命令无法使用该标志.所以现在我用下面的方式实现我的目标

nvm_use (){
   NODE_NEW=$1

   PREVIOUS_PACKAGES=$(npm ls -g --parseable --depth=0)

   nvm use ${NODE_NEW}

   ALL_PACKAGES=$(npm ls -g --depth=0)

for PACKAGE in $(echo "$PREVIOUS_PACKAGES" | grep "/node_modules/<a href="#footnote-npm"><sup>[npm]</sup></a>");
do
           PACKAGE_NAME=${PACKAGE##*/}
           PACKAGE_IN_CURRENT_VERSION=$(echo "$ALL_PACKAGES" | grep $PACKAGE_NAME)
if [ "$PACKAGE_IN_CURRENT_VERSION" = "" ]; then
                   npm i -g $PACKAGE_NAME
fi
done
}

你需要拷贝上面的代码并粘贴到你的.bashprofile文件,重启你的终端(或者使用source ~/.bashprofile) .然后你就可以使用以下命令切换版本

nvm_use 7.6.0

这种方式不会一次又一次的安装包,但是肯定会更新新添加的包.
我知道,这不是具体的方法,但是一个达到我们目的的方法。

相关文章

  1. Setup JavaScript project environment with Webpack, ESLint, Babel & git
  2. Make Sublime Text a JavaScript IDE – JS Development
  3. Why Angular is releasing version 4 and not 3, after 2?
  4. import vs require – ESM & commonJs module differences
  5. Setup your node.js project easily with voidcanvas-cli
  6. Best way to update & manage your node.js versions
编辑于 2017-12-12

文章被以下专栏收录

    定期推送资深工程师的原创文章,话题以前端为主,当然也会涉及到后端以及其它话题,重要的是一定都是原创。