布產(chǎn)物構(gòu)建指南:npm 包與 Electron 二進(jìn)制的構(gòu)建、打包與發(fā)布流程)
Cypress 發(fā)布產(chǎn)物構(gòu)建指南npm 包與 Electron 二進(jìn)制的構(gòu)建、打包與發(fā)布流程【免費(fèi)下載鏈接】cypressFast, easy and reliable testing for anything that runs in a browser.項目地址: https://gitcode.com/GitHub_Trending/cy/cypress本篇圍繞 Cypress 倉庫中的構(gòu)建指南 building-release-artifacts.md 展開講清 Cypress 發(fā)布產(chǎn)物的兩大組成——npm 包與二進(jìn)制壓縮包——各自如何構(gòu)建、打包與驗證。讀完你能掌握yarn lerna run build-cli、yarn binary-build、yarn binary-package、yarn binary-zip等命令的完整用法與適用平臺限制并能結(jié)合 scripts/binary/build.ts、scripts/binary/zip.js 等源碼理解產(chǎn)物內(nèi)部的組裝過程。發(fā)布產(chǎn)物的整體結(jié)構(gòu)Cypress 的cypressnpm 包由兩部分組成二者必須保持同一版本號npm 包.tgz由 cli 目錄構(gòu)建包含命令行工具cypress、TypeScript 類型定義和 Module API最終用戶通過 npm/Yarn/pnpm 將其安裝到項目的node_modules目錄。二進(jìn)制.zip由 packages 目錄構(gòu)建包含 Electron 應(yīng)用、ffmpeg以及 packages 子目錄中各包的構(gòu)建產(chǎn)物frontend-shared、reporter、web-config不單獨(dú)打包進(jìn)去同時包含上述所有包的生產(chǎn)依賴在cli安裝時或執(zhí)行cypress install時被下載到系統(tǒng)緩存目錄生產(chǎn)環(huán)境下若本地未緩存會從 Cypress CDN 拉取。該指南覆蓋了這兩種產(chǎn)物的構(gòu)建方式并額外提供了打包、冒煙測試、上傳與緩存清理等配套流程。構(gòu)建 npm 包指南原文特別提示以下兩步在 CI 中已自動化按正式發(fā)布流程見 release-process.md走時不需要你手動執(zhí)行。構(gòu)建一個 npm 包只需要兩步遞增根 package.json 中的version運(yùn)行yarn lerna run build-cli。這兩步實際完成的工作構(gòu)建cypressnpm 包將代碼轉(zhuǎn)譯為 ES5以兼容常見的 Node 版本結(jié)果輸出到 cli/build 目錄。從源碼看build-cli腳本定義在 cli/package.json 中build: rollup -c, postbuild: yarn make-bin-executable yarn sync-build-dist yarn prepare-package-json yarn bundle-ct-frameworks, build-cli: rollup -c yarn postbuild,即先用 cli/rollup.config.mjs 完成 Rollup 打包隨后依次執(zhí)行 bin 可執(zhí)行化處理、產(chǎn)物同步、package.json 準(zhǔn)備cli/scripts/prepare-package-json.ts與組件測試框架的框架打包cli/scripts/bundle-ct-frameworks.ts保證 npm 包內(nèi)容完整可發(fā)布。構(gòu)建二進(jìn)制同樣地二進(jìn)制的構(gòu)建步驟在 CI 中已自動化。npm 包必須有同版本的二進(jìn)制與之對應(yīng)生產(chǎn)環(huán)境下若本地未緩存會從 CDN 檢索。本地構(gòu)建的入口命令見根 package.json 的scripts命令作用腳本定義yarn binary-build構(gòu)建二進(jìn)制cross-env NODE_OPTIONS--max_old_space_size8192 node ./scripts/binary.js buildyarn binary-package打包electron 打包二進(jìn)制cross-env NODE_OPTIONS--max_old_space_size8192 node ./scripts/binary.js packageyarn binary-zip將構(gòu)建好的二進(jìn)制壓縮為 zipnode ./scripts/binary.js zipyarn binary-smoke-test對構(gòu)建產(chǎn)物做冒煙測試node ./scripts/binary.js smokeyarn binary-deploybuild → zip → upload 一條龍node ./scripts/binary.js deployyarn binary-purge清理某版本各平臺的 CDN 緩存node ./scripts/binary.js purge-version注意binary-build與binary-package都通過cross-env注入了NODE_OPTIONS--max_old_space_size8192因為構(gòu)建過程內(nèi)存占用較高。平臺選擇可以在 Linux 上構(gòu)建 Cypress 二進(jìn)制與 CI 相同的方式——在yarn docker容器內(nèi)運(yùn)行yarn binary-build和yarn binary-package。倉庫根目錄提供了 docker-compose.yml 支撐該容器環(huán)境。macOS 本地構(gòu)建需要在鑰匙串中擁有代碼簽名證書按 Apple 官方代碼簽名指南申請。另外由于公證notarization需要 Apple Developer Program 賬號本地構(gòu)建時通常應(yīng)設(shè)置SKIP_NOTARIZATION1跳過公證。CI 中的代碼簽名細(xì)節(jié)見 code-signing.md。構(gòu)建階段內(nèi)部做了什么源碼級解讀yarn binary-build最終調(diào)用 scripts/binary/index.js 中deploy.build再進(jìn)入 scripts/binary/build.ts 的buildCypressApp。其流程與源碼注釋高度對應(yīng)禁止交叉構(gòu)建if (platform ! os.platform())直接拋錯Attempting to cross-build, which is not supported——這正是指南要求在哪個平臺構(gòu)建哪個平臺產(chǎn)物、或用 docker 構(gòu)建 Linux 版的底層原因見 scripts/binary/build.ts#L77-L80清理與符號鏈接刪除TMP_BUILD_DIR、build/與packages/electron/dist并將build符號鏈接到系統(tǒng)臨時目錄下的cypress-build/platform/build路徑常量定義在 scripts/binary/meta.ts 的TMP_BUILD_DIR、buildRootDir構(gòu)建各子包把目標(biāo)version寫回根package.json保證 V8 快照與版本正確然后并發(fā)執(zhí)行yarn lerna run build與yarn lerna run build-prod并發(fā)度為min(4, os.availableParallelism())拷貝到 distpackages.copyAllToDist把各包產(chǎn)物拷貝進(jìn) dist 目錄并拷貝 patches 目錄過濾掉.dev.patch因為生產(chǎn)安裝只會應(yīng)用生產(chǎn)補(bǔ)丁同時拷貝yarn.lock保證安裝一致性精簡生產(chǎn)依賴剔除devDependencies、lint-staged等字段后寫入 dist 的package.jsonpostinstall只保留patch-package再執(zhí)行yarn --production瘦身用del刪除各依賴包中的測試目錄如pixelmatch/test、exif-parser/test等、.ts源文件與開發(fā)用補(bǔ)丁寫入運(yùn)行時入口生成 dist 的index.jsrequire(./packages/server/index.js)與包含electronVersion/electronNodeVersion的package.json構(gòu)建后自驗證testDistVersion在 dist 目錄執(zhí)行node index.js --version并與目標(biāo)版本比對testStaticAssets校驗靜態(tài)資源任何不一致都會讓構(gòu)建失敗。yarn binary-package則調(diào)用packageElectronAppscripts/binary/build.ts#L237移除node_modules/.bin、開發(fā)用 Electron 應(yīng)用目錄等打包后無用的內(nèi)容通過electron-builder以publish: never、asar: false配置進(jìn)行應(yīng)用打包注釋說明因 electron-builder 不會拷貝packages/*/node_modules中的嵌套目錄故不使用 asarWindows 路徑長度防護(hù)checkMaxPathLength按默認(rèn)緩存位置 260 字符上限檢查 dist 內(nèi)所有相對路徑超限即報錯要求提升hoist或刪除文件scripts/binary/build.ts#L45-L70macOS GateKeeper 校驗當(dāng)platform darwin且未跳過簽名時用spctl -a -vvvv驗證應(yīng)用簽名失敗即拋 Verifying App via GateKeeper failedscripts/binary/build.ts#L309-L326最后用du -d 1統(tǒng)計各包大小并做性能追蹤便于控制 Test Runner 體積。各平臺產(chǎn)物目錄約定由 scripts/binary/meta.ts 統(tǒng)一管理macOS 為build/macM1 為build/mac-arm64下的Cypress.appLinux 為build/linux-unpackedarm64 為linux-arm64-unpackedWindows 為build/win-unpacked見meta.buildDir實現(xiàn)。冒煙測試構(gòu)建完成后建議跑yarn binary-smoke-test。對應(yīng) scripts/binary/index.js 的smoke方法在無顯示環(huán)境下自動啟動 xvfbxvfb.isNeeded()然后執(zhí)行testExecutableVersion——調(diào)用構(gòu)建產(chǎn)物的可執(zhí)行文件加--versionLinux 沙箱環(huán)境會追加--no-sandbox斷言輸出與構(gòu)建版本一致再對應(yīng)用目錄執(zhí)行 scripts/binary/smoke.js 的冒煙測試。打包壓縮二進(jìn)制yarn binary-zip的調(diào)用鏈?zhǔn)莇eploy.zip→meta.zipDir(platform)取待壓縮目錄 →zip.ditto(zipDir, zipPath)。scripts/binary/zip.js 按平臺分派三種壓縮工具平臺工具命令要點Linuxzipcd 父目錄 zip -r9 dest Cypress先renameFolder確保頂層目錄名為CypressmacOSdittoditto -c -k --sequesterRsrc --keepParent src dest保留資源分叉并保留頂層目錄Windows7-Zip7z a dest src整個目錄含頂層Cypress/壓入其中 Linux 與 Windows 路徑在壓縮后會執(zhí)行checkZipSizescripts/binary/zip.js#L70-L84const MAX_ALLOWED_SIZE_MB os.platform() win32 ? 295 : 256zip 超過 256MBWindows 295MB直接拋錯。源碼注釋特別叮囑修改這個上限前先查清是什么導(dǎo)致了二進(jìn)制體積增長并在 PR 中說明。發(fā)布流水線與 CDN 校驗yarn binary-deploy走完整管線scripts/binary/index.js#L417-L435build→zip→upload。upload將 zip 上傳到 S3 的指定路徑upload.getFullUploadPath隨后通過 scripts/binary/util/upload.js 清理該版本的 Cloudflare 緩存。發(fā)布完成后還有兩級 CDN 校驗release流程清單校驗checkManifest拉取download.cypress.io/desktop.json確認(rèn)manifest.version與發(fā)布版本一致下載校驗checkDownloads對 5 個平臺/架構(gòu)組合linux-x64、linux-arm64、darwin-x64、darwin-arm64、win32-x64逐一HEAD請求確認(rèn)二進(jìn)制存在若有缺失提示用yarn binary-purge --version v清理 Cloudflare 緩存后再用yarn binary-ensure --version v復(fù)查見 scripts/binary/index.js#L177-L242。實用技巧指南 Tips 原文加速打包設(shè)置V8_SNAPSHOT_DISABLE_MINIFY1可縮短二進(jìn)制打包耗時。從源碼看該開關(guān)在 V8 快照工具的 tooling/v8-snapshot/src/setup/config.ts#L95 中被讀取const minify !process.env.V8_SNAPSHOT_DISABLE_MINIFY env prod即跳過生產(chǎn)環(huán)境對快照的壓縮步驟以換取速度M1 芯片在 M1 Mac 上打包后若要實際運(yùn)行該二進(jìn)制需要設(shè)置RESET_ADHOC_SIGNATURE1來重置臨時adhoc簽名。小結(jié)Cypress 的發(fā)布產(chǎn)物由 npm 包與二進(jìn)制 zip 雙軌構(gòu)成npm 包只需遞增版本并執(zhí)行yarn lerna run build-cli產(chǎn)出進(jìn)入cli/build二進(jìn)制則通過yarn binary-build構(gòu)建 dist 并做版本/靜態(tài)資源自驗證、yarn binary-packageelectron-builder 打包、平臺簽名與 GateKeeper 校驗、yarn binary-zip平臺化壓縮并做體積上限檢查三步完成再配合binary-deploy、binary-smoke-test與 CDN 清單/下載校驗形成完整閉環(huán)。所有環(huán)節(jié)在 CI 中已自動化本地執(zhí)行時按本文命令即可復(fù)現(xiàn)平臺限制不支持交叉構(gòu)建、macOS 需簽名證書、Linux 可走 docker是實操中最需要留意的約束。【免費(fèi)下載鏈接】cypressFast, easy and reliable testing for anything that runs in a browser.項目地址: https://gitcode.com/GitHub_Trending/cy/cypress創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考