Racket 编程入门

第 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 生态里事半功倍。