/mruby-devkit

开箱即用的脚手架,将 Ruby 编译成可执行二进制文件,就像 Go 一样。支持 webassembly

Primary LanguageRuby

MRuby Devkit

mruby

MRuby Devkit 是一个开箱即用的脚手架。 基于 MRuby 将你的 Ruby 代码打包成 二进制可执行文件。

方便开发类似于 Golang 的二进制可执行文件。

—— 灵感来自于 Golang 可以编译为二进制可执行文件的迷人特性。


平台:

  • MacOS
  • x86_64 ✅
  • aarch64 ✅
  • Debian/Ubuntu/Mint Linux
  • x86_64 ✅
  • aarch64 ✅
  • WebAssembly ✅

一、使用约定

前置运行环境

MacOS、Linux

  • GCC/Clang

  • Make

  • Git

  • Ruby3

    • Rake 安装 gem install rake
  • emscripten (如果需要转 webassembly)

约定

1. src/main.rb 程序入口

程序入口不可修改。它是 runbuild 寻找的入口。

2. src/lib/*.rb 是多文件

lib 中适合存放拆分的多文件。

多文件中,如果存在依赖关系。需要特殊命名比如 01xxx, 02xxx …… 控制相对顺序。

多文件最终会被拼接成一个上下文送入编译。

3. mruby.conf.rb 是 mgem 配置文文件

可以引入 第三方 mgem

裁剪需要加入的 gem,控制编译选项。

注意:

  • 第三方标准库并不是每一个都可以被正确 build 比如 mgem-curses 无法 build,因为存在 BUG。
  • 要正确的配置编译选项,确保 mruby 产生。
  • 配置的 mgem 可以直接在上下文中使用,不需要 require

差异

  • MRuby 和 CRuby 标准库有差异,请关注官方的文档
  • 工作模式是:裁剪 mgem 、功能,最后编译的解释器 + mruby 代码 进行联合工作。 mruby 代码不需要 require 语句导入包。
  • MRuby 有可能工作在嵌入式环境中,以及可能没有文件系统的硬件中。所以编译成 二进制应用。
  • MRuby 和 CRuby 内核不同。 MRuby 实现精简高效,全部采用可跨平台的 C 语言,内存实现高效,精简,适用于嵌入式、跨平台。
  • MRuby 更像是 C 项目在开发,需要了解 C 语言以及构建的概念

二、开发

0. 编写程序

src 下编写 ruby 程序

1. 运行程序

模仿 golang 的 go run

rake run

2. 编译当前程序(默认使用当前计算机平台)

模仿 golang 的 go build

rake build

3.交叉编译的包

借助 Github Action 编译不同平台的可执行二进制文件。

  • 可以 fork 仓库在 Github Action 运行结果下可以看到构建产物。

Github Action 提供免费的 Runner

  • Windows
  • MacOS AMD64
  • MacOS ARM64
  • Ubuntu AMD64

如果你想获得 Linux aarch64 需要自建 Runner。

你需要修改 .github/workflows/raspbian-aarch64.yml 使用自己的支持 aarch64 的 runner。

3.1 WebAssembly 的说明

rake run:wasm    # run wasm program
rake build:wasm  # build wasm program

提供两个命令支持 转换为 WebAssembly,注意 WebAssembly 并不支持所有 mgem,需要自己根据情况来编写。 纯 Ruby 的逻辑 Wasm 支持。

======= 所以你需要修改 .github/workflows/raspbian-aarch64.yml 使用自己的支持 aarch64 的 runner。

7055a3e (update: readme)

4. 内置 Rake 命令

rake -T 查看可用命令

➜  build git:(main) rake -T
rake build       # build program
rake build:wasm  # build wasm program
rake release     # release package
rake run         # run program
rake run:wasm    # run wasm program

TODO

  • 交叉编译
  • 多文件
  • run 命令
  • build 命令
  • 自动初始化
  • 支持 WebAssembly
  • require_relative