【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Agent】【OpenCode】源码构建(依赖安装)
继续对比了 TS 和 JS 的开发体验,并简单推理了下 TS 的编译过程,然后提到了像 Bun 这样的现代工具,之所以看起来像能直接运行 TS 代码,其实是在后台自动编译了 TS → JS,最后再总结了下两者的区别,然后开始使用 bun install 安装 OpenCode 源码的依赖,发现安装依赖的过程中发现卡住了,原因是 npm 官方源在国内访问极慢或容易被干扰,通过临时指定 registry 强制使用国内镜像源最后成功安装了 OpenCode 所需的依赖,下面继续分析
OpenCode
安装完 OpenCode 依赖之后,可以开始构建项目

通过 bun run build 命令可以开始构建项目,把 TypeScript 等源码转换成可运行的 JavaScript,并打包优化,就像 npm run build 和 yarn build 一样,不过需要注意的是,这里的 build 不是 Bun 内置命令,而是 package.json 中定义的脚本

另外,要注意的是,这里是路径是 packages/opencode/package.json,而不是项目根目录下的那个 package.json,在终端输入
bash
bun run --cwd packages/opencode src/index.ts --help
可以查看到 opencode 的帮助信息如下

OK,接着先进入 opencode 的目录
bash
cd packages/opencode
然后在 opencode 的目录下,再输入
bash
bun run build
对项目进行构建,此时会开始跑 build 脚本

构建成功后

构建成功后,dist/ 目录下可以看到构建出的 OpenCode 多平台预编译二进制文件,独立可执行,无需 Bun/Node.js 即可运行 ,比如当前的系统是 Ubuntu(Linux)+ x86_64(AMD 64位),所以可以用 opencode-linux-x64 这里的版本

终端输入
bash
./dist/opencode-linux-x64/bin/opencode --version
可以看到构建出来的版本信息

终端输入
bash
./dist/opencode-linux-x64/bin/opencode
可以看到构建出来的 opencode 程序,版本信息在右下角

当然,如果嫌麻烦,毕竟构建所有平台的可执行二进制文件也是要花时间的,打开 build.ts 文件,这里有个 --single 选项

当该选项生效时,其他平台版本的 opencode 将不会被构建(返回 false)

OpenCode 支持构建的所有平台目标 allTargets 内容如下
bash
const allTargets: {
os: string
arch: "arm64" | "x64"
abi?: "musl"
avx2?: false
}[] = [
{
os: "linux",
arch: "arm64",
},
{
os: "linux",
arch: "x64",
},
{
os: "linux",
arch: "x64",
avx2: false,
},
{
os: "linux",
arch: "arm64",
abi: "musl",
},
{
os: "linux",
arch: "x64",
abi: "musl",
},
{
os: "linux",
arch: "x64",
abi: "musl",
avx2: false,
},
{
os: "darwin",
arch: "arm64",
},
{
os: "darwin",
arch: "x64",
},
{
os: "darwin",
arch: "x64",
avx2: false,
},
{
os: "win32",
arch: "arm64",
},
{
os: "win32",
arch: "x64",
},
{
os: "win32",
arch: "x64",
avx2: false,
},
]
这里涉及到四个属性 os,arch,abi,avx2,这四个属性是构建跨平台可执行文件(尤其是用像 Bun,Node.js,nexe 等工具打包时)的核心概念,下面来详细分析下
首先是 os 操作系统,表示目标程序运行的操作系统类型,属于底层软件(不同操作系统提供的底层接口,系统调用,动态库格式都有区别),所以上层应用的构建包要区分操作系统,Bun 工具集支持的三种操作系统:
linux:各种 Linux 发行版,比如 Ubuntu,CentOS,Debian 等darwin:macOS,macOS 内核叫做 Darwinwin32:Windows,无论 32 位还是 64 位,Node/Bun 都叫 win32

OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Agent】【OpenCode】源码构建(平台目标属性)