You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动