结论
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。
换句话说,依赖是v8←libv8←therubyracer。
使用 Homebrew 安装 v8,使用 gem 安装 libv8 和 therubyracer。
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_racer、libv8-node 等,并在不依赖therubyracer、mini_racer 等的情况下重新构建,它成功了。
最后
在 M1 Mac 上使用 therubyracer 让 Rails 应用程序正常工作的正确方法是什么?
-
从项目中删除
therubyracer - 使用完整的 Docker 构建环境
就个人而言,我认为删除过时的therubyracer 的策略更干净。
致谢
我在研究这件事的各种事情时发现了伊藤纯一的推文,并在推特上问了他一个问题。我设法在不使用therubyracer 而不是以某种方式构建环境的建议下解决了这个问题。谢谢你! ?
参考网站
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308626892.html