惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
H
Help Net Security
V
Visual Studio Blog
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
MyScale Blog
MyScale Blog
The Cloudflare Blog
Martin Fowler
Martin Fowler
D
Docker
腾讯CDC
F
Fortinet All Blogs
雷峰网
雷峰网
GbyAI
GbyAI
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
博客园 - 叶小钗

Ruby

一個用 DIDComm 實現服務器間通信的 Rails demo RubyConf China 2024 参会报告 - Day 1 有对 Ruby 感兴趣的吗? MRuby Devkit 一个简单的脚手架,帮助你像 Go 一样把 Ruby 编译成可执行二进制文件 [翻译] Async Ruby(异步 Ruby) [翻译] Ruby Fiber Scheduler Ruby 3.2.0 发布 Ruby on Mac 用 100 行 Ruby 代码模拟 JavaScript 的 Eventloop 管窥蠡测从思考游戏到实现 2048 用 Ruby 讲从创业到 996 公司的故事(戏说 master-worker 模式) Sinatra 源码分析 (一):set 系统工作原理 《Ruby 设计模式》笔记 Ruby 标准库有趣部分摘要 并行并发进程线程协程 GIL 概念简明解释笔记(Ruby 举例) Sinatra 的 app 模板,提供一些胶水代码支持类似 Rails 的体验 Ruby 的方法查找再往前一步 有在深圳至简天成的吗? 求加微信 Ruby 3.0.0 Released 新建了个 ruby 中文讨论群 Language Hopping, Ruby 为什么不火,一点瞎想 ruby,一代优秀语言就这样陨落了吗? ruby 的 "a" 和 :a 能转换吗 求大佬帮安装一个 mastodon,有偿! notepad++ ssh 一些个小坑 有什么好的方法/IDE 阅读 Gem 库的源码? 问一个 ruby 的问题 用 discourse 搭了个论坛 求测试 找小伙伴一起开发和完善一个 Ruby 增量代码覆盖率统计工具 都在说抑郁,我们学一下 ruby 吧,一门让你快乐的语言
使用 Ruby-build 在 MacOS 上 编译 Portable Ruby
Mark24 · 2024-05-27 · via Ruby

RubyChina 讨论: https://ruby-china.org/topics/43710

我的 Blog

大家好,我是 Mark24 。

分享下我的笔记,使用 Ruby-build 在 MacOS 上 编译 Portable ruby

设想一下,如果 ruby 可以变成 portable 的,放在 U 盘上就可以带走,传输到任何一台电脑上就可以执行。

Portable Ruby + 你的 Ruby 代码 的 zip 包,就像一个行走的独立软件。就像 Go 打包的一样。

你还可以把他们塞入 一些壳软件里。就像 Electron 那样运行(内部是个浏览器)。

当然 Ruby 社区曾经有很多方案 Traveling Ruby 、Ruby Packer , 都用各自的方式实现类似的效果,不过都不维护了。

下面用一个简单的方法来制作 Portable Ruby 。


截止 2024-05-27 最新版本是 3.3.1 。 每个版本因为特性的不同构建是一个动态的过程。就以 3.3.1 为例。

过程偷懒,建立在 ruby-build( https://github.com/rbenv/ruby-build) 的基础上。

不论是 asdf 、rvm …… 他们的背后都是 ruby-build 一个方便安装的 standalone 的工具。ruby-build 解决了大部分的问题,我们只需要找到合适的构建参数。

一、前置依赖

1.安装 Mac 的基础工具集

终端输入 xcode-select --install

2.安装上 homebrew

https://brew.sh/

获得 类似于 Linux 上的包管理工具

3.安装 Ruby 编译需要的前置依赖

# 安装前置依赖
# ruby-build 是安装工具
# openssl@3 readline libyaml gmp 是必要的依赖
# rust 是 YJIT 必要的依赖,不装就不会构建 YJIT 功能

brew install ruby-build openssl@3 readline libyaml gmp rust

二、编译

0.知识点

C 语言( CRuby 是 C 语言项目)编译一般分为 3 个基本过程

1 )预处理:处理一些前置的宏替换
2 )编译:把 .c 代码文件翻译成 .o 机器码文件目标文件
3 )链接:把 .o 文件和系统的底层库(比如标准输入输出)正确的关联起来。生成可执行文件

链接这部,有两个基本的实现

1 )静态链接
2 )动态链接

静态链接比较简单,就是把所有用到的代码打包成一个整体。软件就像一个 exe 文件,带到哪儿都可以执行。
优点就是,随处执行。缺点就是体积大,更新困难,比如你依赖的系统部分有安全缺陷。你必须整体替换。

动态链接,就是软件把用到公共部分(系统、上游 lib )的部分,指他们的动态库( linux 是 so 文件,windows 是 dll 文件,mac 里是 dylib 文件)。
优点:体积小, 如果公共部分有安全漏洞,系统更新,只需要更新动态链接库文件,所有引用的软件都会获得更新。
缺点:除了无法 portable ,软件运行的前提是系统拥有相应的 库。

动态链接是常态,不论是 Linux 、MacOS 、Windows 。动态链接的实践这么多年运行的一直很好。通常库都是按照动态链接库方向来设计的。没有提供静态库。

MacOS 还禁止系统动态库进行 静态链接。
  1. 最简单的编译

关键参数:

  • $HOME/portable-ruby 是你存放的目录
  • --enable-load-relative 地址是相对目录,这对我们移动很重要
  • --with-static-linked-ext 静态链接
RUBY_CONFIGURE_OPTS="--enable-load-relative --with-static-linked-ext" ruby-build 3.2.2 $HOME/portable-ruby

2.一些优化选项

可以参考 https://github.com/rbenv/ruby-build

额外的选项

  • --with-out-ext=win32,win32ole 去掉 MacOS 上不需要的拓展
  • --disable-install-doc 关闭文档,减小体积
  • --disable-install-rdoc
  • --disable-dependency-tracking
RUBY_CONFIGURE_OPTS="--enable-load-relative --with-static-linked-ext --with-out-ext=win32,win32ole --disable-install-doc --disable-install-rdoc --disable-dependency-tracking " ruby-build 3.2.2 $HOME/portable-ruby

ruby-build 能做的更多,比如支持交叉编译

三、Portable Ruby

编译正确完成,你应该获得了 portable ruby

在拥有 依赖库的电脑上(对,我们前面解释了,系统部分是禁止 静态链接的)。

你的可以把你的 ruby 代码 + portable ruby 放在一个文件夹里。 用 一个 shell 脚本,通过相对路径连接起来执行。

比如这样

#!/usr/bin/env bash
./portable-ruby/bin/ruby ./main.rb

某种意义上,Portable Ruby + Ruby Script 和 Go 、Crystal 打包的可执行文件,是一样的。就是大了一点 :D

我的 Blog