Fragments Of Time

Happiness only real when shared.

整合 Maven 與 Yeoman, 學習筆記(1) - node_modules

如同 Java 可以使用 Maven 來幫助專案開發自動化, 管理程式庫的依賴關係及下載等瑣碎的維護問題, 使用 Yeoman(Yo/Bower/Grunt) 可以輔助 Web Front-End 自動化開發, 減少人工勞動容易發生的失誤.

這一系列筆記, 將記錄整合及學習 Maven / Yeoman 的過程中所遇到的各種問題, 疑惑, 注意事項及各種使用到的附加元件. 目標是整合 Maven 及 Yeoman, 建構從 Back-End 到 Front-End 一致的自動化專案建構架構.

這一篇記錄的, 是關於 node 模組依賴關係的問題.

當使用 yo webapp 指令來生成專案時, 會立即下載一堆依賴模組, 這些依賴模組的檔案, 都會放在專案根目錄下的 node_modules 目錄下, 我使用的 yo 1.0.6 版會產生總共 41.7 MB 大小的檔案. 仔細去看的話, 這些檔案在每個生成的專案都是完全相同的. 這實在是個浪費, 尤其是當要 git 或備份專案檔案, 或者使用 dropbox 同步的時候, 都必須要設法避開這些檔案.

使用過 Maven 管理專案的人, 應該都知道 Maven 使用 groupId, artifactId, version 三個 '座標' 指定唯一的程式庫版本. 這些通用的模組, 都是放在 local repository 供所有的專案共用的, 絕對不會有重複的情形.

不幸的是, 這似乎是 node 社群不打算解決的問題, 使用 install node_modules global 作為關鍵字搜尋, 可以找到很多疑問. 但是, 在 Why can't npm just put everything in one place, like other package managers? 這裡, 明白說了:

because it's a terrible idea that causes more problems than it solves.

還有

npm will not help you do something that is known to be a bad idea.

老實說, 我不太能同意這樣的說法和態度, 同樣的東西 Maven 可以做的到, 做得很好, 為何對 node 就是 terrible idea?

好吧! 既然這是一個不會被解決的問題, 只好想辦法自行解決:

  1. 連結它, 避開它:
    • 移除專案 node_modules 目錄下的每個模組, 然後重新建立連結:
      (在 DOS 下)進入 node_modules 目錄, 執行
      for /d %f in (*) do (npm uninstall %f | npm link %f)
    • 每次專案新增依賴模組時, 針對新增模組執行一次
      npm uninstall new_module | npm link new_module,
      或執行一次上面的 for 迴圈指令, 全部更新.
  2. 接受它, 放下它:
    • 就...假裝看不見吧.

不論選用上面哪種方法, 都必須要處理下面的設定與改變:

  • 在 .gitignore 檔案中, 指定不要保存 node_modules 目錄, 避開它.
  • 備份的時候, 指定不要備份該目錄, 譬如 7-Zip:
    7za a -r -xr!node_modules my_project c:\my_project\*.*.
  • Dropbox 同步: 嗯...不要用了.

前面第一種方法, 是我自己實驗出來的, 先試用一陣子看看, 不行的話, 再採用第二種方法.

歡迎大家的回饋與心得分享.

相關文章:
參考文章: