天天看點

node 版本控制 package.json

我們使用node開發時,經常需要依賴一些子產品,我們進行了下載下傳之後,便一直在該版本的子產品環境下進行開發,但是線上的伺服器一般都是根據依賴來配置檔案,重新下載下傳各個子產品,但是保不齊某個子產品的版本已經更新了,這時線上的包會更新到最新的版本,但你的代碼還是依據老版本來寫的,這時可能會産生一些不知名的Bug,

首先看npm包的版本号的格式X.Y.Z,版本好的格式遵循semver 2.0規範,其中X為主版本号,隻有更新了不向下相容的API時進行修改主版本号,Y為次版本号,當子產品增加了向下相容的功能時進行修改,Z為修訂版本号,當子產品進行了向下相容的bug修改後進行修改,這就是“語義化的版本控制”。

預設情況下,當用--save或者--save-dev安裝一個子產品時,npm通過脫字元(^)來限定所安裝子產品的主版本号,而該脫字元對于不同的版本号有不同的更新機制
  • ^1.2.1 代表的更新版本範圍為 >=1.2.1 && < 2.0.0
  • ^0.2.1 代表的更新版本範圍為 >=0.2.1 && < 0.3.0
  • ^0.0.2 代表的更新版本範圍為 0.0.2(相當于鎖定為了0.0.2版本)

##### 對于上述字元的版本控制,我們可以來進行一個嘗試:

首先可以看到package.json中對于vuex的版本依賴為^2.3.1

node 版本控制 package.json

然後檢視以下項目中安裝的vuex子產品的版本号

node 版本控制 package.json

果然沒錯,改版本号為2.3.1,接下來我們看一下vuex的曆史版本(npm view vuex versions)

node 版本控制 package.json

可以看到2.3.1-2.5.0之後到了3.0.0,接下來運作npm update vuex,檢視以下更新後的版本

node 版本控制 package.json

現在我們看到更新後的vuex版本号為2.5.0 < 3.0.0,可以驗證第一條規範。

我們再來驗證下主版本号為0的版本控制情況,先将目前項目依賴的vuex版本改為@0.6.1版本.

npm uninstall vuex
//解除安裝vuex成功
npm install [email protected] --save
//安裝vuex0.6.1版本成功
           
node 版本控制 package.json

然後更新目前項目中的vuex版本,執行代碼 npm update vuex

node 版本控制 package.json

可以通過npm view vuex versions看到vuex的版本曆程,在0.6.3之上為0.7.0,是以當使用脫字元(^)來控制版本号時,當主版本号為0,即代表該子產品在快速建構中時,更新項目時的版本範圍隻能更新修訂版本号Z。

對于第三種情況,當主版本和此版本都為0時,代表着該子產品處于一個極其不穩定的狀态,在執行update時并不會進行版本更新。

波浪号(~)是限定子產品的次要版本,(以下規則測試方法同上,便不一 一測試)
  • ~1.5.1允許安裝版本号大于1.5.1但小于1.6.0版本的子產品
  • ~0.5.1允許安裝版本号為0.6.0
當主版本号/次版本号/修訂版本号為X or x or *時,那麼update或install是會下載下傳該分支最新的版本号
  • (*)跟新或安裝子產品時會安裝>=0.0.0的最新版本
  • 1.x 表示的更新範圍為>=1.0.0&&< 2.0.0
  • 1.2.x 表示的更新範圍為>=1.2.0&&< 1.3.0

更多版本規範

1,當然我們也可以把項目依賴的包固定在某一個版本,強制大家安裝相同的依賴樹,如下所示:

npm install react --save -E
 //此指令會将react的版本号進行固定,但是該方式隻能控制項目中直接依賴的包的版本,無法控制項目子產品中依賴的包的版本号,是以這種方式也無法讓不同的使用者得到相同的依賴樹。
           

2,此外我們還可以使用npm shrinkwrap,可以将項目中的子產品版本進行精确鎖定:

這時候隻需要運作指令 npm shrinkwrap,便會産生一個npm-shrinkwrap.json檔案,這個檔案儲存了所有目前使用的依賴子產品的版本:把該檔案送出到git倉庫中,這樣其他人在clone你的項目的時候,執行npm install指令時,npm檢測到該檔案中的資訊會完整的還原出完全相同的依賴樹,具體的使用方法如下:

npm install --save-dev react //安裝react
npm prune    //清除未被使用的子產品
npm shrinkwrap
           
但是使用這種方法,安裝一個子產品包的方式比較繁瑣。

3,使用yarn我們也可以得到子產品包精确控制的結果

yarn是一個與npm相容的node包管理器,使用它安裝npm包,會自動在項目目錄建立一個yarn.lock檔案,該檔案包含了目前項目中所安裝的依賴包的版本資訊,其他人在使用yarn安裝項目的依賴包時就可以通過該檔案建立一個完全相同的依賴環境。

使用方法如下:

yarn init  //使用yarn建立一個項目
 yarn add 子產品名  //使用yarn 安裝一個包
 //還有很多yarn指令
           
此外,yarn除了可以自動幫我們鎖定依賴包的版本,yarn還在本地緩存已經安裝過的包,當再次安裝時,直接從本地讀取即可。安裝速度得到大大提升。但yarn的使用需要整個團隊都去使用,還是有一定的成本的。

綜上所述,目前大多數項目中較為簡單的使用規範,在項目中依賴各個子產品時,對于主版本号和次版本号都為0的不穩定的項目,我們可以使用精确版本(exact),對于主版本号為0次版本号不為0的子產品和主版本号不為0的子產品,使用caret Range即脫字元(^)來控制版本。當然,我們也可以對項目依賴子產品的版本進行精确鎖定。

SemVer(Semantic Versioning) 2.0.0

SemVer是一個對npm包版本進行規範的子產品,它對于npm包的版本号有着一系列的規則,以下為摘抄自SemVer 2.0.0中的規則:

  1. 在版本控制環節我們已經說過了,子產品的版本号采用X.Y.Z的格式,且都必須為非負的正整數,依次為主版本号、次版本号,修改版本号。
  2. 當規定版本的子產品進行釋出之後,對于該子產品的任何修改,都必須釋出新版本。
  3. 主版本号為0.X.Y的子產品處于開發階段,子產品并不穩定。
  4. 主版本号在有不向下相容的API釋出時必須修改,在主版本号遞增時,次版本号和修訂版本号必須重新歸零。
  5. 次版本号再有向下相容的API釋出時進行遞增修改,在子產品中有API被棄用時也必須遞增次版本号,當此版本号遞增改變時,修訂版本号Z必須歸零。
  6. 版本的優先級就是各個版本的排序規則,判斷版本優先級時,必須把版本号從左至右分為主版本号、次版本号、修訂版本号、以及先行版本号來進行比較

繼續閱讀