结论

therubyracer 应该扔掉!

我尝试了很多东西,但至少根据我的研究,我无法找到一种方法让应用程序在与 M1 Mac 上的therubyracer 共存的同时正常工作。

我可以删除它吗?

由于每个项目的环境会有所不同,很难说绝对没​​问题,但是如下文所述,如果环境可以运行Node.js,大部分情况下删除therubyracer就可以了。

至少在我正在开发的 Rails 应用程序中,它运行良好。

这很简单,只需从Gemfile 中删除gem 'therubyracer' 并运行bundle install

如果您不使用Gemfile,只需运行gem uninstall therubyracer

可能需要的步骤

过去几天我一直在反复试验,当我删除 therubyracer 并重新构建时,它起作用了,所以在这个过程中可能有一个必要的步骤。

所以以防万一,我会分享我到目前为止所做的事情。

删除了英特尔版本 v8

有些文章建议使用 Intel 版本的 Homebrew 安装 v8@3.15。

但是,由于没有必要,因此将其删除。

arch -x86_64 /usr/local/bin/brew uninstall v8@3.15

如果您按照这些说明安装它,请使用上述命令将其删除。

为 ARM 添加了 v8

我没有从 Homebrew for Intel 中删除 v8@3.15,而是从 Homebrew for ARM (M1 Mac) 安装了 v8,但没有指定版本。

brew install v8

Homebrew for ARM 无法安装 v8@3.15,但可以安装 v8。

事后看来,我不确定这是否有必要。我没有验证它,因为删除它并从头开始尝试一切都很麻烦......

移除不必要的宝石

我尝试了各种围绕 JS 的 gem,但它们都没有在 M1 Mac 上正常工作。

因此,如果Gemfile 中提到了下面的 gem,您可能需要删除它,除非您在该项目中使用它。

宝石文件
-gem 'libv8'
-gem 'libv8-node'
-gem 'therubyracer'
-gem 'mini_racer'

然后不要忘记运行bundle install

bundle install

它有可能在未经许可的情况下在某处被使用,因此我建议不仅将其从Gemfile 中删除,还应将其从您的系统中删除。

gem uninstall libv8 libv8-node therubyracer mini_racer

谢谢你

从这里开始,作者只是在努力表明在M1 Mac上使用therubyracer是不现实的,所以只有时间充裕的人才可以。

关于安装过程

安装therubyracer 需要安装libv8,安装libv8 需要v8

换句话说,依赖是v8libv8therubyracer

使用 Homebrew 安装 v8,使用 gem 安装 libv8therubyracer

v8

所以首先尝试使用 Homebrew 安装 v8。 therubyracer 需要 v8@3.15 所以安装它。

brew install v8@3.15

然后我收到以下错误:

Error: Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)!

我似乎无法在我的 M1 Mac 上安装 v8。

幸运的是,M1 Mac 有一种称为 Rosetta 2 的机制来克服这些兼容性问题。通过使用它,您将能够运行仅在英特尔上运行的应用程序和程序。

所以,安装 Intel 版本的 Homebrew 并尝试从那一侧安装 v8。

首先安装 Intel 版本的 Homebrew。

arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

然后使用 Intel 版本的 Homebrew 安装 v8。

arch -x86_64 /usr/local/bin/brew install v8@3.15

我能够成功安装它。

libv8

您现在应该能够安装 libv8。执行以下命令进行安装。

gem install libv8 -v '3.16.14.19' -- --with-system-v8

我能够安装它。

bundle install 安装时,bundle config 必须设置为--with-system-v8

bundle config --local build.libv8 --with-system-v8
bundle install

红宝石赛车手

您现在应该也可以安装 therubyracer 了。

安装时需要指定之前安装的 v8 的安装路径,但是需要指定从 Intel 版本 Homebrew 安装的路径。

arch -x86_64 /usr/local/bin/brew --prefix v8@3.15
/usr/local/opt/v8@3.15

请注意,只需 brew --prefix v8@3.15 指向不同的路径 /opt/homebrew/opt/v8@3.15

通过指定与 Homebrew for Intel 一起安装的 v8 的路径来安装 therubyracer。

gem install therubyracer -v '0.12.3' -- --with-v8-dir=$(arch -x86_64 /usr/local/bin/brew --prefix v8@3.15)

与 libv8 一样,如果您从 bundle install 安装,则需要使用 bundle config 预先配置选项。

bundle config --local build.therubyracer --with-v8-dir=$(arch -x86_64 /usr/local/bin/brew --prefix v8@3.15)
bundle install

兼容性问题

好吧,看起来你已经成功安装了rubyracer。严格来说,“安装”本身已经完成,但并没有按预期工作。

现在,尝试运行rake 命令。

bundle exec rake routes

我收到一个错误,它不兼容。我认为原因很简单,因为我试图在 ARM 处理器上运行 x86_64 的程序,但我得到与 arch -x86_64 bundle exec rake routes 相同的错误。

不仅rake 而且rails 等也给了我同样的原因错误。

我不知道如何解决这个问题,我被卡住了......

mini_racer 怎么样?

therubyracer 的替代品是 gem mini_racer

据说它也与 M1 Mac 兼容,所以我也尝试过。

gem install mini_racer

但是,虽然我可以自己安装,但由于报错symbol not found in flat namespace,无法使用。

顺便说一句,此时来自@scruff311 的评论我删除了mini_racerlibv8-node 等,并在不依赖therubyracermini_racer 等的情况下重新构建,它成功了。

最后

在 M1 Mac 上使用 therubyracer 让 Rails 应用程序正常工作的正确方法是什么?

  • 从项目中删除 therubyracer
  • 使用完整的 Docker 构建环境

就个人而言,我认为删除过时的therubyracer 的策略更干净。

致谢

我在研究这件事的各种事情时发现了伊藤纯一的推文,并在推特上问了他一个问题。我设法在不使用therubyracer 而不是以某种方式构建环境的建议下解决了这个问题。谢谢你! ?

参考网站


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308626892.html

相关文章:

  • 2021-09-16
  • 2022-03-04
  • 2021-05-14
  • 2021-06-08
  • 2022-12-23
  • 2021-10-18
  • 2022-02-22
  • 2022-12-23
猜你喜欢
  • 2022-01-02
  • 2021-11-08
  • 2022-01-03
  • 2021-12-03
  • 2021-05-07
  • 2021-04-27
相关资源
相似解决方案