
如何用 make validate-builds 验证 npm 上发布的 esbuild 二进制与本地构建一致【免费下载链接】esbuildAn extremely fast bundler for the web项目地址: https://gitcode.com/GitHub_Trending/es/esbuildesbuild 的发布产物是按平台拆分的 npm 包esbuild/linux-x64、esbuild/darwin-arm64、esbuild-wasm等每个包里带有预编译的二进制。Makefile 中的validate-builds目标用于回答一个问题npm registry 上已发布的这些二进制和从对应版本源码本地重新构建出来的二进制是否逐字节一致。它的注释直接说明了目的This checks that the published binaries are bitwise-identical to the locally-build binaries。这个校验面向发布流程和仓库维护场景——当你需要核实某个已发布版本版本号来自 version.txt在 npm 上的产物没有被污染、且构建过程可复现时就运行它。适用前提validate-builds是一条完整的构建加下载链路运行前确认以下条件一份 esbuild 的 git 仓库检出且工作区干净。该目标的第一步就是git fetch --all --tags git checkout v$(ESBUILD_VERSION)会检出 version.txt 中版本号对应的发布 tag当前为v0.28.1未提交或未跟踪的文件会导致这一步失败。Node.js构建链路依赖node scripts/esbuild.js它负责把版本号同步到各package.jsonversion-go目标并在 wasm 构建中充当运行时。Go 的版本必须与 go.version 一致即1.26.5。Makefile 的check-go-version会用go version | grep -F go$(GO_VERSION) 检查不一致时会提示Please install Go version $(GO_VERSION)。make、curl和shasummacOS 及多数 Linux 发行版自带Makefile 使用类 Unix 语法Windows 下需要在 Git Bash 等环境运行。网络访问目标会访问 npm registryhttps://registry.npmjs.org/下载各平台 tarball而平台构建还会从https://go.dev/dl/下载并编译一个定制版 Go 工具链go/$(GO_VERSION)目标会跳过该步骤如果目录已存在整个校验耗时较长。不需要为它做任何前置构建每个platform-*目标会自行完成交叉编译。执行 make validate-buildsmake validate-builds这是唯一入口命令。它依次对 Makefile 中列出的全部平台包执行validate-build共 27 个包全部esbuild/平台包aix-ppc64、android-arm、darwin、freebsd、linux 各架构、netbsd、openbsd、openharmony-arm64、sunos-x64、wasi-preview1、win32 等、esbuild-wasm。每个包内部的validate-build流程是先检查TARGET、PACKAGE、SUBPATH三个环境变量均已提供缺少任一立即报错退出本地构建该平台的二进制输出到仓库内的npm/目录例如npm/esbuild/linux-x64/bin/esbuild或npm/esbuild-wasm/esbuild.wasm用curl从 npm registry 下载对应版本的 tarball$(PACKAGE)-$(ESBUILD_VERSION).tgz解包到临时目录validate/对本地二进制和下载的二进制分别运行shasum最后用cmp逐字节比较npm/$(SCOPE)$(PACKAGE)/$(SUBPATH)与validate/package/$(SUBPATH)比较结束后删除临时目录validate。注意它没有按平台筛选的参数运行就是全量校验。如果只想抽查单个包例如排查某个平台失败可以直接调用底层的validate-build并自行提供三个环境变量make TARGETplatform-linux-x64 SCOPEesbuild/ PACKAGElinux-x64 SUBPATHbin/esbuild validate-buildSCOPE为esbuild/esbuild-wasm不带 scopeSCOPE留空、PACKAGEesbuild-wasm、SUBPATHesbuild.wasm。该目标会在仓库内创建并清理validate目录、构建产物写入npm/目录同样要求工作区干净。如何判断校验通过shasum输出的是每个包的校验和本地一份、下载一份ls -l显示两个文件的元信息这些输出用于人工核对但判定依据不是这些数字本身。真正的成功条件是cmp逐字节比较不产生差异某个包比较通过时终端没有cmp的报错输出make 继续下一个包任一包不一致cmp报错、该目标失败整个make validate-builds随即中止。因此跑完全部 27 个包且 make 以 0 退出即为验证通过npm 上发布的二进制与本地构建逐字节一致。发布后还有一条自动交叉验证.github/workflows/validate.yml 在 tag 匹配v*的推送或手动触发workflow_dispatch时在ubuntu-latest上按 go.version 装好 Go 后运行make validate-builds。也就是说官方发布流程本身就把本地重新构建与 npm 产物的一致性作为发布后的固定检查。限制与失败处理工作区不干净有未提交/未跟踪文件时git checkout v$(ESBUILD_VERSION)会失败。这也是 CHANGELOG-2021.md 中说明的可复现性前提发布脚本保证构建时 git 状态无未提交/未跟踪文件本地复现验证同样需要干净检出。如果 tag 不存在例如发布流程在推送 tag 前中断参见 RUNBOOK.md 描述的发布流程git fetch --all --tags拿不到v$(ESBUILD_VERSION)第一步就会失败此时应等发布流程补推 tag 后再验证。首次运行需要编译定制版 Go 工具链并下载 Go 源码耗时明显go/$(GO_VERSION)目录保留后后续运行只重跑各平台构建。校验对象是已发布的版本。本地改动源码再构建去比对 npm 产物没有意义——不一致是预期结果不是故障。相关入口Makefilevalidate-builds、validate-build及各platform-*目标的完整定义.github/workflows/publish.yml发布流程make validate-builds的校验对象正是它产出的包RUNBOOK.md发布与新增平台包的维护流程docs/development.md以 Makefile 为核心的开发与构建说明。【免费下载链接】esbuildAn extremely fast bundler for the web项目地址: https://gitcode.com/GitHub_Trending/es/esbuild创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考