【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Agent】【OpenCode】项目配置(应用级 Monorepo)
分析了 OpenCode 历史的提交记录,其中版本号的变更基本都是由 OpenCode 单独提一个合入请求 MR 进行更新的,单次 MR 内,只有更新版本号这一个动作,并且这个动作会更新掉所有子包里的版本号,并将修改同步到bun.lock,结合历史提交记录,可以推断出 OpenCode 的子包大概是不用发布到 npm 的,属于应用级别的 Monorepo,而不是库级别的 Monorepo,然后接着分析了两种 Monorepo 的区别,接着分析了另一个关键配置字private,当private为true时,npm/yarn/pnpm 会拒绝执行 npm publish,也说明了 OpenCode 使用的是应用级别的 Monorepo,接着分析了export配置字在库级别 Monorepo 和应用级别 Monorepo 的区别,下面继续分析
OpenCode
下面接着分析export配置
这里的"./*": "./src/*.ts"是 Node.js,Bun 官方支持的子路径模式,等价于
import { foo } from ‘opencode/utils/helper’ → 解析为 opencode/src/utils/helper.ts
import { bar } from ‘opencode/services/auth’ → 解析为 opencode/src/services/auth.ts
任意深度,任意文件,只要src/下存在对应的.ts文件就能导入
另外注意,这里指向的是源码.ts文件,而不是dist/构建产物,因为 Bun 原生支持直接执行 TypeScript,所以支持exports通配符可以直接指向源码
OK,最后再来分析下package.json和tsconfig.json,子包下唯二的两个 JSON 配置文件
终端输入
find.-path"./opencode/node_modules"-prune-o-name"tsconfig.json"可以看到项目下的所有tsconfig.json文件,可以看到项目中所有的tsconfig.json如下
可以看到,有子包的地方,除了有package.json,还有tsconfig.json,这俩文件虽然都是 JOSN 格式,且经常出现在同一个目录中,但其职责和设计目的完全不同,简单来说,package.json是写给 Node.js 等包管理器看的运行时与依赖契约,而tsconfig.json则是写给 TypeScript 编译器看的类型检查与转译指令,下面来详细看下
| 维度 | package.json | tsconfig.json |
|---|---|---|
| 核心职责 | 定义包的元数据,依赖,入口,脚本等 | 定义 TS 编译选项,类型检查范围,路径映射等 |
| 主要消费者 | npm/pnpm/yarn/bun,Node.js 运行时 | tsc,IDE(VSCode),ESLint 等 |
| 是否 Node.js 标准 | 是(Node.js 官方规范) | 否(TypeScript 团队自定义) |
| 缺失后果 | 目录不被识别为包,无法install或publish | TS 回退到默认配置,IDE 可能报错或行为异常 |
| Monorepo 中的角色 | workspace 协议,依赖拓扑,exports解析等 | 项目引用,baseUrl/paths别名,增量编译等 |
| 运行时影响 | 直接影响程序如何被加载和执行 | 仅影响构建,检查阶段,构建产物中不包含此文件 |
结合之前的分析,两者的配合方式非常清晰,其中
package.json负责包级别的连接,比如
workspaces告诉包管理器哪些子目录是内部包export告诉 Bun,Node.js 等在 import 时去哪里找文件dependencies声明这个包依赖谁bin,main,type,private决定包作为整体如何被消费
tsconfig.json则负责代码级别的连接,如
references告诉 tsc 子包之间的类型依赖关系,支持增量编译paths让 IDE 和 tsc 能解析@opencode/utils/*这类别名(注意,这里和package.json的exports是两套独立机制)include和exclude控制哪些文件参与类型检查compilerOptions.strict等统一整个 Monorepo 的类型安全级别
OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog