無(wú)星的前端之旅(二十六)—— 離線安裝npm庫(kù)


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_modulesplaywright相關(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í)間

npm 倉(cāng)庫(kù)私有包離線化安裝方案

其中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)單打包命令

cdnode_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-coretgz
  • 2.修改playwrightpackage.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)安裝

playwright-1.37.1.tar.gz

playwright-core-1.37.1.tgz

在項(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è)吧(攤手)

如果有老哥老姐知道有寫好的工具,麻煩丟一份給我,感謝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容