一荐健,package.json
在 Node.js 中险耀,模塊是一個(gè)庫或框架音半,也是一個(gè) Node.js 項(xiàng)目则拷。Node.js 項(xiàng)目遵循模塊化的架構(gòu)贡蓖,當(dāng)我們創(chuàng)建了一個(gè) Node.js 項(xiàng)目,意味著創(chuàng)建了一個(gè)模塊煌茬,這個(gè)模塊的描述文件斥铺,被稱為 package.json。
-
package.json 屬性說明:
- name - 包名宣旱;
- version - 包的版本號仅父;
- description - 包的描述;
- homepage - 包的官網(wǎng)URL浑吟;
- dependencies / devDependencies - 生產(chǎn)/開發(fā)環(huán)境依賴包列表笙纤。它們將會被安裝在 node_module 目錄下;
- peerDependencies 對等依賴 參見:https://nodejs.org/en/blog/npm/peer-dependencies/
-
如何更新/下載 package.json 里的依賴包
-
npm install -save moduleName 命令
1. 安裝模塊到項(xiàng)目node_modules目錄下组力。
2. 會將模塊依賴寫入dependencies 節(jié)點(diǎn)省容。
3. 運(yùn)行 npm install 初始化項(xiàng)目時(shí),會將模塊下載到項(xiàng)目目錄下燎字。
4. 運(yùn)行npm install --production或者注明NODE_ENV變量值為production時(shí)腥椒,會自動(dòng)下載模塊到node_modules目錄中。 -
npm install -save-dev moduleName 命令
1. 安裝模塊到項(xiàng)目node_modules目錄下候衍。
2. 會將模塊依賴寫入devDependencies 節(jié)點(diǎn)笼蛛。
3. 運(yùn)行 npm install 初始化項(xiàng)目時(shí),會將模塊下載到項(xiàng)目目錄下蛉鹿。
4. 運(yùn)行npm install --production或者注明NODE_ENV變量值為production時(shí)滨砍,不會自動(dòng)下載模塊到node_modules目錄中。 拉取單個(gè)依賴最好后面加上你需要的版本號妖异,如:npm install -save @angular/router@7.2.16
-
-
是否允許你的依賴自動(dòng)更新
- '~'(波浪符號):他會更新到當(dāng)前minor version(也就是中間的那位數(shù)字)中最新的版本惋戏。放到我們的例子中就是:"exif-js": "~2.3.0",這個(gè)庫會去匹配更新到2.3.x的最新版本他膳,如果出了一個(gè)新的版本為2.4.0响逢,則不會自動(dòng)升級。波浪符號是曾經(jīng)npm安裝時(shí)候的默認(rèn)符號棕孙,現(xiàn)在已經(jīng)變?yōu)榱瞬迦敕枴?/li>
- '^'(插入符號): 這個(gè)符號就顯得非常的靈活了舔亭,他將會把當(dāng)前庫的版本更新到當(dāng)前major version(也就是第一位數(shù)字)中最新的版本。放到我們的例子中就是:"vue": "^2.2.2", 這個(gè)庫會去匹配2.x.x中最新的版本蟀俊,但是他不會自動(dòng)更新到3.0.0分歇。
- 不加 ^和~,表示不更新欧漱,是精確版本。
二葬燎,package-lock.json
- package-lock.json 是在
npm install
時(shí)候生成的一份文件误甚,用以記錄當(dāng)前狀態(tài)下實(shí)際安裝的各個(gè) npm package 的具體來源和版本號缚甩。package-lock.json 文件的作用鎖定安裝時(shí)的包的版本號,并且需要上傳到 git窑邦,以保證其他人在npm install
時(shí)大家的依賴能保證一致擅威。 - 為什么需要把package-lock.json提交到gitlab
- package.json 文件只能鎖定大版本,也就是版本號的第一位冈钦,并不能鎖定后面的小版本郊丛,
npm install
都是拉取的該大版本下的最新的版本,為了穩(wěn)定性考慮我們幾乎是不敢隨意升級依賴包的瞧筛,這將導(dǎo)致多出來很多工作量厉熟,測試/適配等,所以 package-lock.json 文件出來了较幌,當(dāng)你每次安裝一個(gè)依賴的時(shí)候就鎖定在你安裝的這個(gè)版本揍瑟。 - package-lock.json記錄的是依賴樹,記錄了依賴模塊之間的完整依賴關(guān)系乍炉。package.json記錄的是依賴項(xiàng)绢片,不能鎖定依賴的依賴。
- package.json 文件只能鎖定大版本,也就是版本號的第一位冈钦,并不能鎖定后面的小版本郊丛,
三岛琼,執(zhí)行npm i (npm install)的時(shí)候底循,是如何執(zhí)行package.json和package-lock.json的?
- 當(dāng)你的項(xiàng)目里只有package.json時(shí)槐瑞,node會先從package.json文件中讀取所有dependencies信息熙涤,然后根據(jù)dependencies中的信息與node_modules中的模塊進(jìn)行對比,沒有的直接下載随珠,已有的檢查更新灭袁,并生成package-lock.json。
- 下載和更新按照package.json 文件按照鎖定情況窗看,更新到大版本的最新小版茸歧。
- 當(dāng)你的項(xiàng)目里既有package.json和package-lock.json時(shí),node會從package.json里面讀取模塊名稱显沈,并從package-lock.json文件里找到對應(yīng)的版本號软瞎,進(jìn)行下載或者更新。
- 這里的下載和更新是指按照package.json 文件指定版本下載拉讯,不會更新到大版本的最新小版涤浇。
- 正因?yàn)橛辛藀ackage-lock.json文件鎖定版本號,所以當(dāng)你執(zhí)行npm install的時(shí)候魔慷,node不會自動(dòng)更新package.json文件中的模塊只锭,必須用npm install packagename(自動(dòng)更新小版本號)或者npm install packagename@x.x.x(指定版本號)或者手動(dòng)更改package.json來進(jìn)行安裝才會更新,package-lock.json文件中的版本號也會隨著更新院尔。
- 當(dāng)package.json與package-lock.json都不存在蜻展,執(zhí)行"npm install"時(shí)喉誊,node會重新生成package-lock.json文件,然后把node_modules中的模塊信息全部記入package-lock.json文件纵顾,但不會生成package.json文件伍茄,此時(shí),你可以通過"npm init --yes"來生成package.json文件施逾。
四敷矫,版本控制
- 當(dāng)多人同時(shí)修改package-lock.json的時(shí)候,有可能出現(xiàn)沖突汉额,為了避免這種沖突曹仗,在我們執(zhí)行npm install命令時(shí),先拉取一下遠(yuǎn)程分支闷愤。
- 當(dāng)出現(xiàn)沖突時(shí)整葡,我們需要怎么解決?
- 如果沖突較少讥脐,建議手動(dòng)解決遭居。
- 如果沖突較多,可以通過手動(dòng)修復(fù)任何
package.json
沖突然后npm install [--package-lock-only]
重新運(yùn)行來解決旬渠。參見:https://docs.npmjs.com/files/package-locks#resolving-lockfile-conflicts