M1 MacBook(macOS 11.3.1)下Ruby 2.6.6执行rake db:setup时遇TypeError: unable to resolve type 'size_t'问题求助
解决M1 Mac上Ruby 2.6.6运行
rake db:setup时报TypeError: unable to resolve type 'size_t'的问题 我之前在搭载M1芯片的Mac(macOS 11.x版本)上折腾Ruby 2.6.6和MySQL时,也碰到过一模一样的错误。这个问题的核心是Ruby 2.6.6对Apple Silicon架构的兼容性不足,加上mysql2 gem和arm64架构的类型定义不匹配导致的。下面是我亲测有效的几种解决方案,按优先级排序:
方案一:用Rosetta转译运行终端(最直接)
Apple Silicon的Rosetta可以模拟x86架构,完美解决老版本Ruby的兼容性问题:
- 找到Launchpad里的「终端」App,右键选择「复制」,得到一个终端副本
- 右键这个副本,选择「显示简介」,勾选「使用Rosetta打开」
- 打开这个Rosetta终端,先卸载你当前安装的arm版本Ruby 2.6.6(以rbenv为例):
rbenv uninstall 2.6.6 - 重新安装适配x86架构的Ruby 2.6.6,注意指定openssl路径(Ruby 2.6需要openssl 1.1):
RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)" rbenv install 2.6.6 - 切换到项目目录,卸载并重新安装mysql2 gem,指定MySQL的配置路径(假设你用Homebrew安装了MySQL):
gem uninstall mysql2 gem install mysql2 -v '你的项目依赖的mysql2版本号' -- --with-mysql-config=$(brew --prefix mysql)/bin/mysql_config - 最后重新运行数据库初始化命令:
bundle exec rake db:setup
方案二:用Docker运行MySQL(绕开本地架构问题)
如果不想折腾Ruby的架构,也可以把MySQL放到Docker容器里运行,彻底避开本地架构的兼容性坑:
- 安装Docker Desktop(确保适配Apple Silicon)
- 用Docker启动一个MySQL容器(比如MySQL 5.7,和你的项目版本匹配):
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=your_password --name mysql_local mysql:5.7 - 修改项目里的
config/database.yml,把数据库连接地址改成localhost,密码改成上面设置的your_password - 直接运行
bundle exec rake db:setup即可
为什么会出现这个错误?
Ruby 2.6.6发布于2020年,那时候Apple Silicon还没推出,官方没有提供arm64架构的预编译版本。当你在M1 Mac上直接安装Ruby 2.6.6时,其实是本地编译的arm版本,而mysql2 gem的底层C扩展在处理size_t这种平台相关的类型时,会出现架构不匹配的解析错误。用Rosetta转译x86版本的Ruby后,类型定义就和mysql2 gem的预期一致了,问题自然解决。
内容的提问来源于stack exchange,提问作者J. Ahmed




