目前日常開發(fā)時,使用的包管理命令是cnpm。
但是cnpm是依賴 npminstall 的,特性之一是不會生成package-lock.json文件。
cnpm工具 相對于 npm 的特點:
1 速度快
2 node_modules中會生成更多的文件夾
3 不會生成 package-lock.json文件
package-lock.json
理想情況下,依賴包的版本是按照 semver規(guī)范 來的,然而實際上有的包可能沒有遵循這一原則。
主版本號:當你做了不兼容的 API 修改,
次版本號:當你做了向下兼容的功能性新增,
修訂號:當你做了向下兼容的問題修正。
有一種思路是為了迎合第三方庫自己的修正,package.json 中對于第三方庫的寫法如下:
"express": "^4.17.1",
這樣可以及時的將第三方庫的bugfix等在項目中體現(xiàn)。
另一種思路是為了保持版本穩(wěn)定不出錯,不自動更新第三方庫的版本,即使是修訂號的更新,這時需要一個文件來存儲“這一次”到底安裝了哪些依賴。
package-lock.json對依賴的描述如下:
"@ant-design/colors": {
"version": "3.2.2",
"resolved": "http://r.cnpmjs.org/@ant-design/colors/download/@ant-design/colors-3.2.2.tgz",
"integrity": "sha1-WtQ9YZ6RHzSI66wwPWBuZqhCOQM=",
"requires": {
"tinycolor2": "^1.4.1"
}
},
描述范圍包括版本、源地址、校驗hash和它自身的依賴。指定它們之后可以保證使用該文件安裝的副本是完全一樣的。
NPM 對 package-lock.json 的策略
1、npm 5.0.x 版本,不管package.json怎么變,npm i 時都會根據(jù)lock文件下載
package-lock.json file not updated after package.json file is changed · Issue #16866 · npm/npm
問題:明明手動改了package.json,卻不升級包
2、5.1.0版本后 npm install 會無視lock文件 去下載最新的npm
why is package-lock being ignored? · Issue #17979 · npm/npm
問題:lock文件失去意義,無法進行版本鎖定
3、5.4.2版本后
如果修改了package.json,且package.json和lock文件不同,在執(zhí)行npm install時npm會根據(jù)package中的版本號以及語義含義去下載最新的包,并更新至lock。
如果在執(zhí)行npm install時package.json和lock文件相同,則忽略更新版本。
NRM ( NPM registry manager)
一種可以使用npm工具安裝淘寶源的方法:
npm install nrm -g
nrm ls
nrm use cnpm
這種情況下速度較快,會生成package-lock.json文件。
Yarn
特點:
- 引入 yarn.lock 文件來管理依賴版本問題,保證每次安裝都是一致的。
- 緩存加并行下載保證了安裝速度
yarn.lock 與 package-lock.json 的主要區(qū)別在于 yarn.lock 中只有一層,而package-lock.json中是嵌套結構。
討論
1 是否使用lock方案
2 如果要使用lock方案,使用哪種方案?(nrm-taobao source/ yarn / npm / 其它)
3 為保證依賴穩(wěn)定,是否有其它注意事項?(如統(tǒng)一 node與npm 版本)