用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
這種方式不會一次又一次的安裝包,但是肯定會更新新添加的包.
我知道,這不是具體的方法,但是一個達到我們目的的方法。相關文章
- Setup JavaScript project environment with Webpack, ESLint, Babel & git
- Make Sublime Text a JavaScript IDE – JS Development
- Why Angular is releasing version 4 and not 3, after 2?
- import vs require – ESM & commonJs module differences
- Setup your node.js project easily with voidcanvas-cli
- Best way to update & manage your node.js versions
推薦閱讀:
※[譯]擴展 Node.js 應用
※Node.js的線程和進程詳解
※eggjs-feed-04
※前端周刊第57期:《戰爭與和平版》的 CSS-IN-JS 黑歷史
