想不安装任何东西就试用 CyberTrain,请打开在线试用:GitHub Codespaces 会在你浏览器中的 VS Code 里打开教程中的博客、cybertrain 命令和 Spinel 2026.10.27.7020。同一个镜像也可以在 Docker 下本地运行。
环境要求
- Spinel
2026.10.27.7020(Cybertrain::SPINEL_TAG,与 .github/workflows/ci.yml 中SPINEL_TAG的版本相同),即 saeki-mototsune/spinel(Cybertrain::SPINEL_REPOSITORY)的一个版本;它是 matz/spinel 的分支,先于上游版本收录了 CyberTrain 所需的修复;未在其他版本上测试。你无需手动安装:cybertrain命令在第一次需要它时会把该版本构建到~/.cybertrain中(cybertrain setup可按需执行这一步),除非PATH上已有该版本的spinel——参见 Spinel 是如何安装的。 - 构建它需要:C 工具链(
cc,或CC指定的编译器)和make——Spinel 会把每个程序编译为 C——以及git和curl。 - SQLite 3 头文件和库(Debian/Ubuntu 上为
libsqlite3-dev;macOS 上随 Xcode 命令行工具提供)——模型直接使用 Spinel 的 FFI,而不是 gem。 - zlib 头文件和库(Debian/Ubuntu 上为
zlib1g-dev;macOS 上在 SDK 中)——gzip 压缩的请求体(request.decoded_body)通过系统的 zlib 解压,绑定方式相同。 - Ruby 3.2+ 和 RubyGems,仅供
cybertrain命令使用(应用从不在 CRuby 上运行);在 Ruby 3.2 上,构建 Spinel 还需要prismgem(见下文)。
cybertrain doctor 会检查这些工具和头文件以及 Spinel 的安装情况;缺少必需项时,它还会打印适用于你的平台的安装命令。
更多软件包Ruby 3.2 上的 prism;OpenSSL 和 jemalloc,均为可选
- 构建 Spinel 需要 Ruby 的
prismgem,Ruby 3.3 及以上已内置;Ruby 3.2 请运行gem install prism(需要 Ruby 的开发头文件,Debian/Ubuntu 上为ruby-dev)。cybertrain doctor会检查它。 - OpenSSL 头文件(
libssl-dev)是可选的:没有它们时,Spinel 构建时会不带其openssl包,而 CyberTrain 并不使用这个包。在 macOS 上,requireopenssl的应用需要让编译器的路径包含 Homebrew 的(keg-only)OpenSSL:export LIBRARY_PATH="$(brew --prefix openssl@3)/lib" CPATH="$(brew --prefix openssl@3)/include"。 - jemalloc 的开发包(
libjemalloc-dev;brew install jemalloc)是可选的:只有当应用的spin.toml写明allocator = "jemalloc"时才需要它,cybertrain new会把这一行写成注释。在生产环境中值得开启:在 examples/blog 上每秒请求数可达 1.1 到 1.4 倍(docs/benchmark.md)。
安装 CLI
gem install cybertrain
cybertrain doctor
第一行从 RubyGems 安装这个命令,第二行检查环境要求;教程从这里接着往下讲,从 cybertrain new 一直讲到 cybertrain build。
cybertrain 命令
cybertrain help 会打印这些命令:
cybertrain new NAME [--path DIR | --version V | --git URL [--ref R]] [--skip-spin]在 NAME 中创建应用,然后在其中运行spin lock和spin run gen,需要时会先安装 Spinel。cybertrain generate scaffold NAME field:type ...(别名g scaffold)为当前目录中的应用添加一个资源。cybertrain generate authentication为其添加用邮箱和密码登录的功能:users 和 sessions 表、User和Session模型、登录和注册的控制器与视图、路由、ApplicationController中的一个before_action,以及一个测试(参见添加登录)。使用--invite-only时没有注册页面:用户通过./NAME user EMAIL创建;在还没有任何用户时,第一个用户也可以在/setup页面创建,该页面只响应服务器所在的机器,并需要服务器启动警告中打印的一次性令牌。cybertrain generate attachment MODEL FIELD [--any]为已生成脚手架的模型添加文件上传功能:五个元数据列、模型方法和回调、一个下载动作、路由、表单字段和一个测试(参见添加封面图片)。脚手架字段cover:attachment的作用相同。cybertrain db migrate先生成代码,再执行待处理的迁移,然后再次生成(spin run gen; spin run db -- migrate; spin run gen);cybertrain migration作为别名保留。cybertrain db COMMAND...在spin run gen之后运行其他任意数据库命令:status、rollback [N](之后会再次生成)、schema:dump、create。cybertrain server [PORT]先生成代码,然后启动开发服务器(spin run gen; spin run NAME,或spin run NAME -- PORT;默认端口 3000)。cybertrain build构建嵌入了app/views/的 NAME,并组装dist/(二进制文件、public/、storage/、tmp/)。cybertrain spin ARGS...在任意目录下用锁定版本的 Spinel 运行spin(cybertrain spin test、cybertrain spin run gen -- --check)。cybertrain setup [--force]把 Spinel2026.10.27.7020安装到~/.cybertrain中,除非PATH上已有该版本的spinel;--force会重新构建~/.cybertrain下的副本。cybertrain doctor检查 C 工具链、SQLite 头文件和 Spinel 的安装情况。cybertrain version打印版本。
db、server 和 build 需在应用目录内运行;NAME 是其 spin.toml 中的 [package] name。
Spinel 是如何安装的
每个运行 spin 的命令(new、db、server、build、spin)都会先确保有 Cybertrain::SPINEL_TAG 所指版本的 Spinel 可用。如果 PATH 上有 spinel(以及 spin),且其 spinel --version 报告的正是该版本,就直接使用它;否则使用 cybertrain 保存在 ~/.cybertrain/spinel/2026.10.27.7020/ 下的副本;如果也没有,cybertrain 就从 Cybertrain::SPINEL_REPOSITORY 的发布标签构建这份副本(git clone、make deps、make -j、make install PREFIX=...),只需一次,耗时几分钟,并把日志写入 ~/.cybertrain/log/spinel-2026.10.27.7020-build.log(某一步失败时会打印其最后几行)。
如果缺少构建所需的工具,cybertrain 会在开始前指出缺少哪个,并打印适用于你的平台的安装命令。PATH 上其他版本的 spinel 永远不会被使用或改动:cybertrain 会保留自己的副本(并在安装时说明这一点)。
cybertrain setup 会按需执行同样的操作,并且在正在使用的是它自己的副本时,打印把它加入 PATH 的那一行,方便你自己运行 spin:
export PATH="$HOME/.cybertrain/bin:$PATH"
~/.cybertrain/bin 中存放指向当前所用版本的 spinel 和 spin 链接,所以版本升级后这一行仍然有效;cybertrain spin ... 则完全不需要 PATH。
环境变量CYBERTRAIN_HOME 替代 ~/.cybertrain,CYBERTRAIN_SPINEL_HOME 使用已有的安装
有两个环境变量可以覆盖以上所有行为:
CYBERTRAIN_HOME替代~/.cybertrain(路径中不能有空格、引号、$或:,Spinel 的 Makefile 和PATH无法处理它们)。CYBERTRAIN_SPINEL_HOME=PREFIX强制使用已有的安装:此时cybertrain使用PREFIX/bin中的spinel和spin(如果spinel直接位于PREFIX中,则使用PREFIX本身中的),如果它们不是该版本,就报错并停止。
gem 与框架
gem install cybertrain 安装的是一个命令,而不是框架。这个 gem 就是 cybertrain 命令,它是纯 Ruby 编写的,在你的机器上运行于 CRuby(3.2 或更新版本)之下,并替你调用 Spinel 的 spin 工具;框架和 Spinel 都不在这个 gem 里。框架是一个 Spinel 包,你的应用在其 spin.toml 中依赖它:Spinel 把它和你的代码一起进行 AOT 编译,所以它从不在 CRuby 上运行,它是随应用交付的部分。dist/ 中的二进制文件无需 Ruby、gem 或 Spinel 即可运行。
cybertrain new 写出什么
cybertrain new 会写出应用,其 spin.toml 指向与 CLI 相匹配的版本(cybertrain = { git =
"https://github.com/saeki-mototsune/cybertrain", ref = "v0.3.1" }),确保 Spinel 已安装,然后运行 spin lock(spin 会把框架拉取到其缓存 ~/.cache/spin/packages/ 中,并在 spin.lock 中锁定提交)和 spin run gen,就像 rails new 会运行 bundle install 一样,最后打印接下来的步骤。框架的任何部分都不会被复制到应用中;请提交 spin.toml 和 spin.lock。
如果 Spinel 或两个 spin 步骤之一失败,已写出的文件会保留,new 以状态码 1 退出,并打印排除原因后需要运行的命令(对于 Spinel:先运行 cybertrain setup,再在新目录中运行 cybertrain spin lock && cybertrain spin run gen)。
有四个选项会改变它写出和运行的内容:
--skip-spin只写出文件:不安装 Spinel,不运行spin lock,也不运行spin run gen。--path DIR改为依赖本地检出的代码 (开发 CyberTrain 本身时,用--path ~/src/cybertrain,检出代码在哪里就写哪里)。--git URL [--ref R]依赖位于 URL 的框架(分支或标签 R)。--version V在框架进入spin-index后依赖索引中的版本。
--path、--version 和 --git 只能给出其中一个;--ref 需要配合 --git。
把应用迁移到新版本
gem 和框架从同一个标签发布,因此版本一致:0.3.1 版的 gem 生成的应用依赖框架 v0.3.1。要把应用迁移到新版本,先更新 gem,把 spin.toml 指向新标签,然后在应用中运行:
cybertrain spin lock
cybertrain spin run gen