npm常用命令學習(npm install -D,semver版本規范, npm進行版本管理的最佳實踐用法)


什么是npm

npm有兩層含義。一層含義是Node的開放式模塊登記和管理系統,網址為npmjs.org。另一層含義是Node默認的模塊管理器,是一個命令行下的軟件,用來安裝和管理Node模塊。
npm不需要單獨安裝。在安裝Node的時候,會連帶一起安裝npm。但是,Node附帶的npm可能不是最新版本,最好用下面的命令,更新到最新版本。

npm install npm@latest -g

@latest表示最新版本
-g表示全局安裝

常用的npm命令

npm help 查看命令列表
npm -l 查看各個命令的簡單用法
npm -v 查看npm的版本
npm config list -l 查看 npm 的配置

npm init 初始化一個package.json文件,但是有很多問答需要手動輸入
npm init -y 默認直接幫我們輸入好,這是一個快捷方式

npm install 下載package.json中的依賴包
npm install --save-dev === npm install webpack -D 
npm install --save === npm install webpack -S
npm info webapck 查看軟件有哪些版本號
npm install webpack@4.2.2 安裝軟件的具體版本

npm set

npm set 用來設置環境變量
上面命令等於為npm init設置了默認值,以后執行npm init的時候,package.json的作者姓名、郵件、主頁、許可證字段就會自動寫入預設的值。這些信息會存放在用戶主目錄的 ~/.npmrc文件,使得用戶不用每個項目都輸入。如果某個項目有不同的設置,可以針對該項目運行npm config。

npm set init-author-name 'Your name'
npm set init-author-email 'Your email'
npm set init-author-url 'http://yourdomain.com'
npm set init-license 'MIT'

npm config

npm config get globalconfig 輸出全局配置文件npmrc的路徑
npm config set prefix $dir 上面的命令將指定的$dir目錄,設為模塊的全局安裝目錄。如果當前有這個目錄的寫權限,那么運行npm install的時候,就不再需要sudo命令授權了。

npm info

npm info命令可以查看每個模塊的具體信息。比如,查看underscore模塊的信息。

npm list

npm list命令以樹型結構列出當前項目安裝的所有模塊,以及它們依賴的模塊。

npm list 當前目錄的依賴樹狀結構
npm list -global 全局目錄的依賴樹狀結構
npm list webpack 列出單個模塊例如webpack

npm install

Node模塊采用npm install命令安裝。每個模塊可以“全局安裝”,也可以“本地安裝”。“全局安裝”指的是將一個模塊安裝到系統目錄中,各個項目都可以調用。一般來說,全局安裝只適用於工具模塊,比如eslint和gulp。“本地安裝”指的是將一個模塊下載到當前項目的node_modules子目錄,然后只有在項目目錄之中,才能調用這個模塊。

# 本地安裝
npm install <package name>

# 全局安裝
sudo npm install -global <package name>
sudo npm install -g <package name>

npm install也支持直接輸入Github代碼庫地址。

npm install git://github.com/package/path.git
npm install git://github.com/package/path.git#0.1.0

安裝之前,npm install會先檢查,node_modules目錄之中是否已經存在指定模塊。如果存在,就不再重新安裝了,即使遠程倉庫已經有了一個新版本,也是如此。
如果你希望,一個模塊不管是否安裝過,npm 都要強制重新安裝,可以使用-f或--force參數。

npm install <packageName> --force

如果你希望,所有模塊都要強制重新安裝,那就刪除node_modules目錄,重新執行npm install。

rm -rf node_modules
npm install

【安裝不同版本】
install命令總是安裝模塊的最新版本,如果要安裝模塊的特定版本,可以在模塊名后面加上@和版本號。

npm install sax@latest
npm install sax@0.1.1
npm install sax@">=0.1.0 <0.2.0"
npm install readable-stream --save --save-exact // 在package.json文件指定安裝模塊的確切版本
npm install <module-name>@1.3.1-beta.3 // 安裝指定的beta版本

install命令可以使用不同參數,指定所安裝的模塊屬於哪一種性質的依賴關系,即出現在packages.json文件的哪一項中。

–save:模塊名將被添加到dependencies,可以簡化為參數-S。
–save-dev: 模塊名將被添加到devDependencies,可以簡化為參數-D

npm install默認會安裝dependencies字段和devDependencies字段中的所有模塊,如果使用--production參數,可以只安裝dependencies字段的模塊。

npm install --production

npm update,npm uninstall

# 升級當前項目的指定模塊
npm update [package name]

# 升級全局安裝的模塊
npm update -global [package name]

npm uninstall命令,卸載已安裝的模塊。

npm uninstall [package name]

# 卸載全局模塊
npm uninstall [package name] -global

npm run

npm不僅可以用於模塊管理,還可以用於執行腳本。package.json文件有一個scripts字段,可以用於指定腳本命令,供npm直接調用。

npm run命令會自動在環境變量$PATH添加node_modules/.bin目錄,所以scripts字段里面調用命令時不用加上路徑,這就避免了全局安裝NPM模塊。

npm run如果不加任何參數,直接運行,會列出package.json里面所有可以執行的腳本命令。

npm內置了兩個命令簡寫,npm test等同於執行npm run test,npm start等同於執行npm run start。

{
  "name": "myproject",
  "devDependencies": {
    "jshint": "latest",
    "browserify": "latest",
    "mocha": "latest"
  },
  "scripts": {
    "lint": "jshint **.js", // 執行命令 npm run lint 則會執行冒號后面的命令
    "test": "mocha test/"
  }
}

關於這部分的內容具體可以看另外一篇文章npm scripts 腳本基礎

npm bin

npm bin命令顯示相對於當前目錄的,Node模塊的可執行腳本所在的目錄(即.bin目錄)。

# 項目根目錄下執行
npm bin
./node_modules/.bin

npm adduser

npm adduser用於在npmjs.com注冊一個用戶。

npm adduser
Username: YOUR_USER_NAME
Password: YOUR_PASSWORD
Email: YOUR_EMAIL@domain.com

npm publish

npm publish用於將當前模塊發布到npmjs.com。執行之前,需要向npmjs.com申請用戶名。

npm owner

模塊的維護者可以發布新版本。npm owner命令用於管理模塊的維護者。

# 列出指定模塊的維護者
npm owner ls <package name>

# 新增維護者
npm owner add <user> <package name>

# 刪除維護者
npm owner rm <user> <package name>

semver規范(語義化版本)

semver 約定一個包的版本號必須包含3個數字,格式必須為 MAJOR.MINOR.PATCH, 意為 主版本號.小版本號.修訂版本號.

MAJOR 對應大的版本號迭代,做了不兼容舊版的修改時要更新 MAJOR 版本號
MINOR 對應小版本迭代,發生兼容舊版API的修改或功能更新時,更新MINOR版本號
PATCH 對應修訂版本號,一般針對修復 BUG 的版本號

對於包作者(發布者),npm 要求在 publish 之前,必須更新版本號。npm 提供了 npm version 工具,執行 npm version major|minor|patch 可以簡單地將版本號中相應的數字加1

常用命令

npm version patch 

對於包的引用者來說,我們需要在 dependencies 中使用 semver 約定的 semver range 指定所需依賴包的版本號或版本范圍。npm 提供了網站 https://semver.npmjs.com 可方便地計算所輸入的表達式的匹配范圍。常用的規則示例如下表:

rang 含義 例子
^2.2.1 指定的 MAJOR 版本號下, 所有更新的版本 匹配 2.2.3, 2.3.0; 不匹配 1.0.3, 3.0.1
~2.2.1 指定 MAJOR.MINOR 版本號下,所有更新的版本 匹配 2.2.3, 2.2.9 ; 不匹配 2.3.0, 2.4.5
>=2.1 版本號大於或等於 2.1.0 匹配 2.1.2, 3.1
<=2.2 版本號小於或等於 2.2 匹配 1.0.0, 2.2.1, 2.2.11
1.0.0 - 2.0.0 版本號從 1.0.0 (含) 到 2.0.0 (含) 匹配 1.0.0, 1.3.4, 2.0.0

任意兩條規則,用空格連接起來,表示“與”邏輯,即兩條規則的交集: 如 >=2.3.1 <=2.8.0 可以解讀為: >=2.3.1 且 <=2.8.0

任意兩條規則,通過 || 連接起來,表示“或”邏輯,即兩條規則的並集: 如 ^2 >=2.3.1 || ^3 >3.2

[注] 除了這幾種,還有如下更直觀的表示版本號范圍的寫法:

  • * 或 x 匹配所有主版本
  • 1 或 1.x 匹配 主版本號為 1 的所有版本
  • 1.2 或 1.2.x 匹配 版本號為 1.2 開頭的所有版本

[注] 在常規僅包含數字的版本號之外,semver 還允許在 MAJOR.MINOR.PATCH 后追加 - 后跟點號分隔的標簽,作為預發布版本標簽 - Prerelese Tags,通常被視為不穩定、不建議生產使用的版本。例如:

1.0.0-alpha
1.0.0-beta.1
1.0.0-rc.3

npm5 新增package-lock 文件

package-lock.json 的作用是鎖定依賴安裝結構,如果查看這個 json 的結構,會發現與 node_modules 目錄的文件層級結構是一一對應的。

npm5.2新增工具npx

npx 的使用很簡單,就是執行 npx <command> 即可,這里的 <command> 默認就是 ./node_modules 目錄中安裝的可執行腳本名。例如上面本地安裝好的 webpack 包,我們可以直接使用 npx webpack 執行即可。如果使用npm webpack命令的話,會調用全局的webpack,但當全局的版本和項目的版本不一致的時候,我們還是可以使用npx來只調用項目中的webpack

最佳實踐

  • 使用 npm: >=5.1 版本, 保持 package-lock.json 文件默認開啟配置
  • 初始化:第一作者初始化項目時使用 npm install 安裝依賴包, 默認保存 ^X.Y.Z 依賴 range 到 package.json中; 提交 package.json, package-lock.json, 不要提交 node_modules 目錄
  • 初始化:項目成員首次 checkout/clone 項目代碼后,執行一次 npm install 安裝依賴包
  • 不要手動修改 package-lock.json
  • 升級依賴包
    • 升級小版本: 本地執行 npm update 升級到新的小版本
    • 升級大版本: 本地執行 npm install @ 升級到新的大版本
    • 也可手動修改 package.json 中版本號為要升級的版本(大於現有版本號)並指定所需的 semver, 然后執行 npm install
    • 本地驗證升級后新版本無問題后,提交新的 package.json, package-lock.json 文件
  • 降級依賴包
    • 正確做法: npm install @ 驗證無問題后,提交 package.json 和 package-lock.json 文件
    • 錯誤做法: 手動修改 package.json 中的版本號為更低版本的 semver, 這樣修改並不會生效,因為再次執行 npm install 依然會安裝 package-lock.json 中的鎖定版本
  • 刪除依賴包:
    • Plan A: npm uninstall 並提交 package.json 和 package-lock.json
    • Plan B: 把要卸載的包從 package.json 中 dependencies 字段刪除, 然后執行 npm install 並提交 package.json 和 package-lock.json

任何時候有人提交了 package.json, package-lock.json 更新后,團隊其他成員應在 svn update/git pull 拉取更新后執行 npm install 腳本安裝更新后的依賴包

小結

通過本文學習下npm的一些常用命令以及規范,semver的版本管理規范,以及npm的一些最佳實踐方式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM