NPM – 套件管理程式

一. 前言

NPM,是「Newbie Paintball Master」…不對是「Nobel Prize Magnet」…也不對,好啦!其實是「Node Package Manager」

雖然本來npm主要是來管理JavaScript的套件(Package),但是越來越多人使用npm,所以在上面可以找到很多其他語言編寫的套件,這也是為什麼npm會被官方惡搞(大家可以點點看官網左上角的小字),因為他已經不是單單為Node.js而生了。

原本是安裝管理Node.js的套件的軟體,本來我們想用別人的code來工作時,需要複製、貼上別人的程式碼到自己的資料夾,但是如果使用npm,我們可以以標準化的方式來安裝、移除或更新這些程式碼。

二. 安裝npm

當你安裝Node.js到電腦上時,npm也會同時被安裝,如果你是使用Mac,可以使用brew install node來安裝,如果你是使用Windows,請直接到Node.js官網下載安裝檔。

補充:LTS = Long Term Support,代表長期支援的版本

三. 尋找套件

有了npm可以安裝套件後,當然也要有地方找我們想要的套件,除了各個套件自己的網站或Github頁面外,npm自己也有個套件列表,我們可以在此搜尋想要的套件,但有時候有多個套件任君挑選時,我們該如何篩選套件呢?

下面列出一些準則來給各位參考(但非絕對):

  • 下載數量:代表了套件的熱門程度
  • Release的次數:越多Release代表越常維護
  • 最後一次publish的時間:要是套件最後一次更新是兩年前,那麼最好還是再找一下其他套件吧
  • Github上issue數:本來是寫越少越好,因為當時單純認為issue數代表問題多寡,但仔細思考後,issue多反而代表該套件十分活躍,所以應該要是越多越好才是(感謝CrazyLion)
  • Github上熱門的程度:星號、關注、貢獻,這些當然都是越多越好囉

四. 安裝套件

安裝套件有兩種模式:LocalGlobal

  • Local:代表本地模式,就是安裝在當下的資料夾內,該套件的指令也只有在當下的資料夾才有作用
  • Global:代表全域模式,安裝之後不管終端機當下位置在哪都可以執行該套件的指令

Node.js套件使用

基本上請詳細看過套件的README,裡面應該都會詳細說明該如何使用,一般來說是在自己的code前面新增一行:var pkgName = require("pkgName");,就可以在自己的code內使用該套件的內容了。

指令列表:

  • 列出所有npm指令
    • npm
  • 以本地模式安裝套件
    • npm install <package name>
    • ex: npm install passport
  • 以全域模式安裝套件
    • npm install -g <package name>
    • ex: npm install -g coffee-script

五. 管理套件

Package.json

要是在本地端安裝套件的話,會看見一個「node_module」出現在資料夾內,裡面放著的就是我們所安裝的套件。

npm_1

npm如何管理這些套件呢?npm會依照目錄內的「package.json」檔來管理套件,我們不用手動去建立一個json檔,執行npm init指令就可以了,執行之後會問我們一些問題,回答完畢之後,npm就會依據現有的套件,建立起屬於這個資料夾的package.json檔。

npm_2

一般來說,假設今天我們寫的一支程式上傳到Github,要是我們把我們所用的套件一起上傳,會十分浪費空間,所以一般我們會在.gitignore內新增一行「node_modules/」,來忽略這個資料夾,但是保留我們的「package.json」,因為只要這個檔案存在,其他下載我們程式的人,可以使用npm install把紀錄在package.json內的套件安裝回去,而不用在clone的時候就下載一堆套件。

安裝套件並寫入package.json

我們使用npm init之後,npm會自動根據現有的套件來產生package.json,但是如果我們之後想安裝新的套件並一起被管理呢?

如果只是單純npm install <package name>,會發現package.json內沒出現新安裝的套件,如果要安裝並同時加入管理的話,要加入—save參數變成npm install --save <package name>,這樣安裝完畢之後,就會看到package.json內的dependencies多了一行,這正是我們新安裝的套件!

devDependencies是什麼?

我們有些套件是為了方便我們開發程式,但是程式實際上運行時並不會使用到該套件,npm有一個好方法來管理,在安裝的時候加入—save-dev變成npm install --save-dev <package name>,安裝完畢之後,會發現我們的套件出現在devDependencies內。

至於差別在哪裡呢?我們要是把node module資料夾清空,重新執行npm install,還是會發現在devDependencies的套件被安裝進去啊!

如果我們要安裝除了devDependencies以外的套件的話,要改成這個指令NODE_ENV=production npm install,這樣就不會把devDependencies的套件安裝進去了!

指令列表:

  • 產生package.json檔
    • npm init
  • 安裝的同時寫入package.json
    • 寫入dependencies
      • npm install —save <package name>
      • ex: npm install —save passport
    • 寫入devDependencies
      • npm install —save-dev <package name>
      • ex: npm install —save-dev mocha
  • 安裝紀錄在package.json的套件
    • 安裝所有套件
      • npm install
    • 安裝除了dev以外的套件
      • NODE_ENV=production npm install

六. 更新套件

會安裝之後當然也要會更新,但是npm更新的依據又是什麼呢?一樣還是package.json。

Semantic Versioning版號命名法

在討論更新之前,先簡單介紹Semantic Versioning這個版本命名方法,我們時常會看到諸如:Version 2.5.9,那個2.5.9就代表著程式的版本號碼。

  • 第一個數字代表主版本號,通常跳一個主版本號都是有重大更新的時候,例如軟體架構大改、取消支援舊瀏覽器等等,容易有和舊版不相容的狀況。
  • 第二個數字代表次版本號,通常是有新功能加入,或是某一個功能做了更動,算是比較小的改動,但是很有可能還是會對舊版的使用者造成影響。
  • 第三個數字代表修訂版號,基本上就是做一些bug的維修,正常情況下是不會有相容性的問題的。

更新限制

了解了版號命名法後,打開package.json檔,我們會看到例如:"colors": "^1.1.2",當然1.1.2就是版本號碼,但是這一行代表什麼意思呢?

  • 「^1.1.2」:表示這個套件的更新只會到最新的次版本號
    • ex: 1.2->更新、1.5->更新、2.0->不更新
  • 「~1.1.2」:表示這個套件的更新只會到最新的修訂版號
    • ex: 1.1.3->更新、1.1.5->更新、1.2.0->不更新

為什麼要有這樣的限制?因為我們使用npm,就是不希望手動更新每一個套件,希望npm來自動化更新,但是我們又怕更新了之後,因為相容性的問題造成程式出現錯誤,所以才會用版本號的限制來限制住npm的更新。

檢查是否需要更新

輸入npm outdated,npm就會列出本地端有哪些套件需要更新。

npm_3

  • Current:代表了現在的版號
  • Wanted:代表了我們希望更新的版號(依據package.json)
  • Latest:代表了這個套件最新的版號

如果我們想看全域下的npm套件是否需要更新呢?輸入npm -g outdated就可以囉。

進行更新

檢查更新有分本地和全域,更新一樣也有分。

  • 更新全部
    • 本地端更新:npm update
    • 全域更新:npm update -g
  • 更新特定套件
    • 本地端更新:npm update <package name>
    • 全域更新:npm update -g <package name>

指令列表

  • 檢查更新
    • 本地端:npm outdated
    • 全域:npm -g outdated
  • 進行更新
    • 更新全部
      • 本地端:npm update
      • 全域:npm update -g
    • 更新特定套件
      • 本地端:npm update <package name>
      • ex: npm update mocha
      • 全域:npm update -g <package name>
      • ex: npm update -g coffee-script

七. 刪除套件

有安裝就會有移除,npm要移除也很簡單,輸入npm uninstall <package name>就解決了,但是你進入package.json一看,發現被刪除的套件還是在裡面,也就是說,之後只要執行npm install時還是會被安裝進來。

要連紀錄都移除了話,要加入—save變成npm uninstall --save <package name>,要刪除devDependencies內的則是npm uninstall --save-dev <package name>,這樣一來就完整移除套件了!

要移除全域套件的話則是加入-g變成npm uninstall -g <package name>就可以囉。

指令列表

  • 移除本地端套件
    • 不移除package.json紀錄
      • npm uninstall <package name>
      • ex: npm uninstall passport
    • 移除package.json紀錄
      • 移除dependencies
        • npm uninstall —save <package name>
        • ex: npm uninstall —save passport
      • 移除devDependencies
        • npm uninstall —save-dev mocha
        • ex: npm uninstall —save-dev mocha
  • 移除全域套件
    • npm uninstall -g <package name>
    • ex: npm uninstall -g coffee-script

3 Comments

  1. Github上issue數:基本上越少越好,但也可能是因為很多人測試所造成的現象
    =======
    我的看法倒是相反,可能是很少人用。 應該是看他issue的動態比較合理。 因為功能需求在github上也是用 issue在管理呢

  2. 學習了,很清楚實用的筆記。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料