title: 無(wú)星的前端之旅(二十六)—— 離線安裝npm庫(kù)
subtitle: 無(wú)星的自動(dòng)化之旅(五)—— PlayWright內(nèi)網(wǎng)升級(jí)playwright版本
comments: true
date: 2023-08-18 21:06:08
categories:
- PlayWright
tags:
- PlayWright
背景
上文我們說(shuō)到了怎么更新ms-playwright
本篇我們來(lái)聊聊怎么遷移playwright的版本
可能有朋友會(huì)奇怪,這有什么難的,把node_modules跟playwright相關(guān)的庫(kù)全部移進(jìn)去不就行了
其實(shí)也對(duì),但是如果我是pnpm呢
其實(shí)雖然這一篇是升級(jí)playwright,但其實(shí)更多的是想表達(dá),如何遷移npm庫(kù)到離線環(huán)境
以playwright為例,下面是我的一些探索
各種包管理工具下的遷移
運(yùn)氣比較好
本文成于2023.8.20
有老哥在2023.8.7總結(jié)了一次
節(jié)省了我很大的時(shí)間
其中yarn我沒(méi)測(cè)試過(guò),npm稍有不準(zhǔn),pnpm可行
這其中,npm提到了一個(gè)庫(kù)npm-package-privatify
ps:
我估摸著作者應(yīng)該是這位小哥jjjona0215
雖然他在文中說(shuō)到,不用關(guān)心解決了什么問(wèn)題哈哈哈
[圖片上傳失敗...(image-5dc233-1692541768461)]
為什么說(shuō)npm稍有不準(zhǔn)呢,因?yàn)?code>npm-package-privatify并不會(huì)打包npm目標(biāo)庫(kù)的依賴庫(kù),作者的目標(biāo)是解決私有庫(kù)的問(wèn)題,確實(shí)只是相似而不是同一目標(biāo),但是他給出了一些方向上的指引
本地庫(kù)的加載
npm 倉(cāng)庫(kù)私有包離線化安裝方案和
離線環(huán)境安裝npm包,如何以tar.gz的形式離線安裝npm包?
中,我們不難發(fā)現(xiàn),包管理工具是支持通過(guò)tar.gz或者tgz加載的
那么我們的問(wèn)題,其實(shí)變成了,如何生成tar.gz或者tgz庫(kù)
ps:
npm-pack-all 我試過(guò)了,相當(dāng)不好用
壓縮包的生成
其實(shí)這一步是最離譜的
說(shuō)實(shí)話,我一直認(rèn)為這是個(gè)簡(jiǎn)單打包命令
cd到node_modules下面的庫(kù)
tar -zcvf <yourname>.tar.gz <yourpath>
這樣做確實(shí)能得到tar.gz包
但是當(dāng)你通過(guò)pnpm或者其他工具安裝時(shí)
你會(huì)發(fā)現(xiàn)package.json里的庫(kù)名變成了操蛋的xxx.tar.gz
用起來(lái)各種報(bào)錯(cuò)
那么我們還有接下來(lái)幾種方案
方式1.使用代碼生成tar.gz
tar命令不靠譜,但是我試用npm-package-privatify發(fā)現(xiàn),它打的tar.gz我能正常引入
關(guān)鍵代碼如下
const fs = require("fs-extra")
const compressing = require('compressing')
const path = require('path')
// 將文件壓縮為.tar.gz
/**
*
* @param {*} fileName 需要打包的npm庫(kù)名
* @param {*} packagePath 待打包的路徑,到node_modules即可
* @param {*} zipFileName 打包后壓縮包名字
*/
const tarGz = async (fileName, packagePath, zipFileName) => {
await compressing.tar.compressDir(
path.join(packagePath, fileName),
path.join(packagePath, `${zipFileName}.tar`)
)
await compressing.gzip.compressFile(
path.join(packagePath, `${zipFileName}.tar`),
path.join(packagePath, `${zipFileName}.tar.gz`)
)
fs.removeSync(path.join(packagePath, `${zipFileName}.tar`))
// fs.removeSync(path.join(packagePath, fileName))
}
誒,就正常了
方式2.直接從npm倉(cāng)庫(kù)下載
打開(kāi)package-lock.json會(huì)發(fā)現(xiàn)
我們要的庫(kù)其實(shí)都是tgz壓縮包,直接下載就行了
[圖片上傳失敗...(image-3cba84-1692541768462)]
而且你會(huì)驚訝的發(fā)現(xiàn),下載下來(lái)是可以通過(guò)包管理工具加載成功的
到這里是不是以為這就完事大吉了,兩種方式都可以得到壓縮包
NO
你會(huì)發(fā)現(xiàn),這個(gè)壓縮包只是單純的壓縮包,它不包含任何自身所需的依賴啊我去
所以我們還需要對(duì)playwright的依賴打包,并且修改package.json的依賴為file
這里所幸我需要的庫(kù)僅為playwright-core,且這個(gè)庫(kù)沒(méi)有任何其他的依賴
那么我需要的就是
- 1.下載
playwright-core的tgz包 - 2.修改
playwright的package.json的依賴為file:類型 - 3.給
playwright打包
這里一定要注意第2點(diǎn),因?yàn)橐话銏?zhí)行npm install等其他命令時(shí),都在項(xiàng)目根目錄下執(zhí)行
所以依賴的file:一定要寫準(zhǔn)備把playwright-core放在什么目錄安裝
例如,我準(zhǔn)備把兩個(gè)壓縮包,都放在一個(gè)特定的文件下workspace/OfflineLibrary/playwright/
[圖片上傳失敗...(image-b8cbe1-1692541768462)]
那么我在打包的時(shí)候,就需要寫為file:OfflineLibrary/playwright/playwright-core-1.37.1.tgz
[圖片上傳失敗...(image-88e51e-1692541768462)]
這里我給個(gè)playwright@1.37.1的產(chǎn)物包,大伙有需要的可以試一下斷網(wǎng)安裝
在項(xiàng)目根目錄下,新建兩個(gè)文件夾OfflineLibrary/playwright,將兩個(gè)包丟進(jìn)去,然后在項(xiàng)目根目錄下執(zhí)行pnpm add ./OfflineLibrary/playwright/playwright-1.37.1.tar.gz就可以成功安裝了。
總結(jié)
到此為止,我們應(yīng)該知道怎么去做npm庫(kù)的離線包了
比如我們需要對(duì)庫(kù)A做離線包
- 1.下載
A的所有依賴庫(kù),并打壓縮包 - 2.修改
A的依賴項(xiàng)為file路徑 - 3.將
A打壓縮包 - 4.將所有的依賴包丟到目標(biāo)倉(cāng)庫(kù)進(jìn)行安裝
到目前我沒(méi)找到稱手的工具,可能需要按這個(gè)思路自己寫一個(gè)吧(攤手)
如果有老哥老姐知道有寫好的工具,麻煩丟一份給我,感謝