iT邦幫忙

1

npm 套件安裝問題

各位大大好,小弟今天遇到一個問題,

描述:
今天有兩個git分支A與B,
在A中使用 npm install A1套件後,套件資訊存於package.json內,
並且於node_module資料夾內成功安裝,接下來,
切換到B分支後使用npm install B1套件
npm 安裝了B1套件,並且刪除A1套件
再次切回A分支後,執行出錯(因為A1套件不存在)。
問題:
1. npm install package.json 會依照內容新增&刪除本地套件?
2. npm install '特定套件',要如何避免發生以上況狀,只單純新增套件(不刪除)

以上,麻煩大大解惑,萬分感謝!!

附上圖片
https://ithelp.ithome.com.tw/upload/images/20210224/201325380sGLbdfZOs.png
以上為A套件新增執行完結果,可看到package內有成功,
https://ithelp.ithome.com.tw/upload/images/20210224/20132538rB5AmMpdpP.png
以上為切換分支後,在新增B套件後,可看見npm將2個包移除。

看更多先前的討論...收起先前的討論...
淺水員 iT邦研究生 2 級 ‧ 2021-02-24 15:31:47 檢舉
node_modules 有在 .gitignore內嗎
@淺水員大大,有的
或許你可以貼上你安裝B1時的結果,這樣才能了解確切原因在哪裡
正常來說是不會去動到其他package
@screenleon 大大,如上圖所示,在請大大解惑
tunin iT邦新手 5 級 ‧ 2021-02-24 16:08:03 檢舉
看起來你有兩個branch一開始都沒安裝任何套件,當然在 test1 安裝 axios 時,自然package 就會有相關紀錄,此時切換到另一個 test2 此時 package 應該就沒有 axios 的紀錄了才是,你可以檢查一下是否是這個狀況。
@tunin大大,您說的沒錯,所以在test2分支時是沒有axios的,但是當我切回去test1時,因為剛剛在test2分支(npm install時,axios被刪除),此時就找不到axios套件了。
想請問當我npm install "特定套件" 的時候,是會根據package.json內的資料去新增或刪除套件?
那有什麼辦法可以避免呢?
請大大指教,感謝!!
tunin iT邦新手 5 級 ‧ 2021-02-24 17:47:38 檢舉
package.json內容會是你專案引用的套件的設定,而實際上安裝了哪一個版本的套件則是於package.lock.json中紀錄,當你執行 npm install時,npm會依照package.lock.json內容整理node_modules的內容,透過這個機制好確保每個開發者取得同一份原始碼時能將node_modules的內容調整為一致的狀態。
7
Peter學程式
iT邦新手 1 級 ‧ 2021-02-24 16:53:23
最佳解答

因為你的 node_modules 沒有被 Git 紀錄,也就代表 Git 不在乎 node_modules 的存在與否。
不過 branch_a 和 branch_b 都各自有一個自己的 package.json ,也就代表他們可能依賴不同的套件,所以你在切換 a 和 b 分支時,都需要做一次 npm install 確保所有被依賴的套件都存在於 node_modules 內。
或者,你也可以考慮使用 Git Worktree

BTW:
這真是個好問題,小弟也因為這個問題開眼界了XD

如大大所言,目前確實是這樣...
Git Worktree 看起來會是個不錯的解決方案!!
速速研究一下!!

感謝大大!!

2

想請問當我 npm install "特定套件" 的時候,是會根據 package.json 內的資料去新增或刪除套件?

是的,例如執行 npm install axios
npm 還是會根據 package.json 的內容新增或刪除套件

另外之前有遇過
如果頻繁切換分支執行 npm install
容易發生套件版本衝突的問題 (有點難除錯所以沒有細查)
所以我後來都習慣把整包 node_module 刪除後才執行 npm install
不過這個做法有點麻煩,不推薦

Peter 大提供的 Worktree 感覺是個不錯的方法

感謝大大解惑,目前小弟也是先依照重新安裝的方式,
會在研究一下 Worktree 的使用方法!!

感謝您!!

2
tunin
iT邦新手 5 級 ‧ 2021-02-24 18:07:33

既然使用npm等套件管理工具,建議進一步理解這些工具的用法。
針對不同版本的原始碼帶來的引用套件差異,npm 引用 package-lock.json 檔進行最終安裝的modules版本的管理
而當執行 npm install 時,npm 會依據一定的優先順序去決定要使用的module版本。
官方目前對 npm install的描述有說明參考檔案的順序
https://docs.npmjs.com/cli/v7/commands/npm-install

而你提問的問題,重點是不同 branch 宣告要引用的 module 就是不一樣的
雖然你在 branch test1 有安裝 axios 可是對於 branch test2 而言你並沒有告訴 npm 你需要 axios 所以當然在 branch test2 中不該有 axios 這個module
正確的程序是在不同的 branch 依據原始碼歷程,你需要分別安裝需要的套件
而當切換不同 branch 時,需執行 npm install 讓 npm 去處理 node_modules 的內容使其符合目前原始碼版本所宣告的套件設定。

感謝大大解惑,確實對npm的了解不夠深入,會在補強一下!!
另外針對切換分支需重新讓npm處理node_modules的套件內容,
依照電腦(無感情...)是完全合理的,
但在使用上,真是一千萬個血淚QQ,
會在深入研究一下!!

感謝您!!

我要發表回答

立即登入回答