第 7 部分 · 走向生产:工程化与实战
raco——Racket 工程体系的控制中心
raco不只是装包的命令,它是 Racket 工程体系的控制中心——包管理、编译、测试、打包发布,全在这一个工具里。
你其实早就用过 raco 了:装第一个第三方包,敲的就是 raco pkg install。大多数人对它的认识也停在这一步——一个装包的命令,类似 Python 的 pip。
这就把 raco 看小了。装包只是它的一小块:跑测试、编译、生成可执行文件、重建文档索引、排查安装后的诡异问题,全都在这一个入口后面。别的语言里这些活儿分属一堆工具,Racket 把它们收成了一个。
别的语言是一堆工具,Racket 是一个入口
回想你熟悉的技术栈:
- Python:pip 管包,setuptools 管打包,pyinstaller 管可执行文件,各管一段
- JavaScript:npm 管包,webpack、vite 管构建,又是一套
- Rust:cargo 已经统一了大半,外围仍要自己配
raco 的思路是把工程侧全部收进一个入口,所有日常工程操作都是它的一个子命令。更特别的是,这些子命令并不神圣——它们本质是普通的 Racket 程序,跟着包系统走。你装的某个包,就可以给 raco 增添新命令,和官方命令平起平坐。工具生态跟着语言一起长,这是"语言即工具"的设计哲学。
raco pkg:包的生命周期
包管理是最常用的一支:
# 安装远程包
raco pkg install some-package
# 本地开发模式(推荐)
raco pkg install --link .
--link 值得单独说一句:它不把包复制进安装目录,而是"链接"到你的本地源码。你在源码里改一行,系统里立刻生效——这是自己开发包时的标准工作方式。
还有一个认知要建立:Racket 的包不只是库。一个包可以同时装着库代码、可执行程序、文档、甚至 raco 的工具扩展。你发布一个包,可以同时给生态提供库和命令。
raco exe:从脚本到可执行文件
# 生成可执行文件
raco exe main.rkt
这一步不是给脚本套个壳,而是完整编译:产出的可执行文件内置运行时,拿到没装 Racket 的机器上也能跑,Windows、macOS、Linux 都支持。怎么把它进一步做成用户能双击安装的程序,第 49 章专门讲。
raco setup:出怪事先找它
raco setup 是最容易被忽视、又最常救你命的一个:编译新装的包、重建文档索引、检查依赖一致性、生成优化缓存,全是它在背后做。装完新包行为诡异、文档打不开,先跑一遍 raco setup,很多问题当场消失。
包、应用、工具:一个项目的三张面孔
| 类型 | 使用方式 | 分发方式 |
|---|---|---|
| 库 | (require ...) | 通过 raco pkg 安装 |
| 应用 | 直接运行 | raco exe 打包分发 |
| 工具 | raco xxx 命令 | 作为包的一部分 |
这三样不是三种项目,而是同一个包的三张面孔:一个项目完全可以既被 require,又能直接运行,还顺手给 raco 贡献一个子命令。理解了这一点,你就明白为什么 Racket 敢把工程侧收进一个工具——它管的从来不只是"库",而是你项目的一生。
把 raco 用起来
日常开发的三段工作流:
# 开发阶段
raco pkg install --link .
# 测试阶段
raco test
# 发布阶段
raco exe main.rkt
之后每次遇到新的工程需求——文档生成、部署、格式检查——先别急着找第三方工具,先问一句 raco 有没有现成的子命令。这个习惯会让你在 Racket 生态里事半功倍。