用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.0nnvm use 7.6.0n

上述方法將幫助你在安裝一個新的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 (){n NODE_NEW=$1nn PREVIOUS_PACKAGES=$(npm ls -g --parseable --depth=0)nn nvm use ${NODE_NEW}nn ALL_PACKAGES=$(npm ls -g --depth=0)nnfor PACKAGE in $(echo "$PREVIOUS_PACKAGES" | grep "/node_modules/<a href="#footnote-npm"><sup>[npm]</sup></a>");ndon PACKAGE_NAME=${PACKAGE##*/}n PACKAGE_IN_CURRENT_VERSION=$(echo "$ALL_PACKAGES" | grep $PACKAGE_NAME)nif [ "$PACKAGE_IN_CURRENT_VERSION" = "" ]; thenn npm i -g $PACKAGE_NAMEnfindonen}n

你需要拷貝上面的代碼並粘貼到你的.bashprofile文件,重啟你的終端(或者使用source ~/.bashprofile) .然後你就可以使用以下命令切換版本

nvm_use 7.6.0n

這種方式不會一次又一次的安裝包,但是肯定會更新新添加的包.

我知道,這不是具體的方法,但是一個達到我們目的的方法。

相關文章

  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

推薦閱讀:

[譯]擴展 Node.js 應用
Node.js的線程和進程詳解
eggjs-feed-04
前端周刊第57期:《戰爭與和平版》的 CSS-IN-JS 黑歷史

TAG:Nodejs | 前端开发 | Web开发 |