我有一台2020年的英特尔Mac电脑,运行着Sonoma.我正在做一个运行在Rails上的Web应用程序项目.在过go 的几个月里,无论我try 什么,我都会遇到同样的问题.我按照他们网站上的Rails说明操作,但我总是遇到OpenSSL错误.我已经为包管理器try 了asdf、rvm和rbenv,并正在try 安装Ruby 3.0.4,这是该应用程序运行的基础.

我不断收到如下所示的错误:

*** Following extensions are not compiled:
openssl:
    Could not be configured. It will not be installed.

我试过下载和重新下载OpenSSL,try 不同的版本,并相应地更改我的路径,以及更改标志和其他东西.然而,我似乎不能使这在我的机器上工作.我最终让它在Oracle VirtualBox上运行,但我更喜欢它在我的Mac上运行.

任何人都有任何 idea 或解决方案.我在不同的网站上看到了很多关于这个问题的帖子,所以这似乎是很多人的问题,但对我来说没有一个是有效的!谢谢!

推荐答案

Ruby 3.0需要OpenSSL1.1版,这个版本现在已经很旧了,在很多环境中都不受支持.建议你升级这款应用,使其至少能在Ruby 3.1上运行,Ruby 3.1使用的是最新的OpenSSL版本.

这就是说,在OSX上,你仍然可以使用homebrewrbenvruby-build来运行它.请注意,指南将使用rbenv作为Ruby管理器,如果您使用其他名称(如rvm),则需要更改一些指南以满足这一要求.(或者卸载它,然后换成rbenv)

请注意,下面的指南将安装Ruby 3.0.6,而不是3.0.4.你可能应该转移到这个版本,因为这是3.0.x分支中的最新版本,它应该仍然不会 destruct 你现有的应用程序.

还请注意,如果需要,下面的步骤也应该适用于Ruby 2.7.我们在2.6版本中取得了一些成功,但我不记得还有其他一些步骤需要它才能运行.

  1. 确保您安装了homebrew个.不过,如果您在Mac上进行开发,应该是标准配置.

  2. 假设你还没有安装ruby管理器,安装并设置rbenv:

brew install rbenv

if [ -n "$ZSH_VERSION" ]; then
  SHELL_CONFIG_FILE_PATH=~/.zshrc
elif [ -n "$BASH_VERSION" ]; then
  SHELL_CONFIG_FILE_PATH=~/.bashrc
else
  SHELL_CONFIG_FILE_PATH=~/.profile
fi

echo "eval '$(rbenv init -)'" >> $SHELL_CONFIG_FILE_PATH
echo "export PATH='$HOME/.rbenv/bin:$PATH'" >> $SHELL_CONFIG_FILE_PATH
source $SHELL_CONFIG_FILE_PATH

如果你使用其他的东西,比如rvmchruby,那么你可以跳过上面的步骤,不过请注意,ruby-buildrbenv一起使用效果最好.

  1. -对不起,先生.
brew install ruby-build
  1. 安装OpenSSL1.1:
brew install openssl@1.1
  1. 使用正确的OpenSSL版本安装Ruby:
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"
rbenv install 3.0.6

注意,如果您不使用rbenv,那么您必须在本地使用ruby-Build:

export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"
ruby-build 3.0.6 /opt/rubies/3.0.6

然后将您的另一个Ruby管理器配置为指向此版本的Ruby.

  1. 设置一些符号链接(可选,但某些gem需要.只有在遇到其他问题时才执行此操作,因为它可能会 destruct 在较新的OpenSSL版本上运行的应用程序):

对于在Rosetta下运行的英特尔Mac或Homebrew:

ln -sf /usr/local/opt/openssl@1.1/lib/libcrypto.dylib /usr/local/lib/libcrypto.dylib
ln -sf /usr/local/opt/openssl@1.1/lib/libssl.dylib /usr/local/lib/libssl.dylib

对于ARM mac:

ln -sf /opt/homebrew/opt/openssl@1.1/lib/libcrypto.dylib /usr/local/lib/libcrypto.dylib
ln -sf /opt/homebrew/opt/openssl@1.1/lib/libssl.dylib /usr/local/lib/libssl.dylib
  1. 手动为您的Ruby 安装opensslRuby :
rbenv local 3.0.6

gem install openssl -v '2.2.3' -- --with-openssl-dir=$(brew --prefix openssl@1.1)

(对Bundle 包文件中的每个opensslgem版本执行此操作)

  1. Ruby 的问题.

一些gem可能需要链接到不同的openssl,如果是这样的话,您可以使用下面的方法.例如,我们在pumaeventmachine上遇到了问题:

brew install openssl@3 openssl

bundle config set --global build.eventmachine --with-ssl-dir=$(brew --prefix openssl@3)
bundle config set --global build.puma --with-openssl-dir=$(brew --prefix openssl@3)

这些步骤应该可以让你在英特尔和ARM Mac的Sonoma上通过并在2024年1月仍然有效.

另外,如果你需要安装一个更新的ruby,同时保持对3.0.6的支持,你应该使用:用途:

export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@3)"

rbenv install 3.1.4
# works with 3.2 and 3.3 as well

Ruby-on-rails相关问答推荐

未捕获语法错误:try 编辑TRIX时,请求的模块未在Rails 7.1中提供名为默认的导出(在youtube.js:1:8)

Rails + Turbo_stream自定义操作:我可以在没有Stimulus的情况下根据DOM状态做出有条件的响应吗?

发送不调用类或模块中的私有方法

Rails 6:强类型原始 SQL 查询返回数组类型

从 rails 5 迁移到 rails 6

Heroku 应用程序上的远程 mysql 数据库

将日期时间转换为月、日和年?

Time.zone.now.to_date 是否等同于 Date.today?

如何使用默认的 Rails 记录器记录 Ruby 异常的整个回溯?

如何从 Rails 路由中删除控制器名称?

Rails:文件路径

Phusion 乘客(适合傻瓜!)

使用god 监控独角兽 - 以非零代码开始退出 = 1

Rails:将所有未知路由重定向到 root_url

减go Ruby 中的日期并以分钟为单位得到差异

Rails:一次添加多个 flash[:notice] 的简单方法

停止 Rails 为视图和助手生成规范测试?

ActiveRecord 查找以

Ruby 中有与 slice 函数相反的函数吗?

Rails.cache 在测试之间被清除了吗?