<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ttys000 (野生麻雀)</title>
    <link>https://ruby-china.org/ttys000</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>2024 年我该如何安装 Ruby on Rails ?</title>
      <description>&lt;h2 id="更新 [Tue May 28 13:10:39 CST 2024]"&gt;更新 [Tue May 28 13:10:39 CST 2024]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;感谢大家的热心帮助。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;很遗憾，我目前还没能顺利在本地安装好 Rails，&lt;/strong&gt;但过程中也学习和了解了很多，现将我的进展和问题整理于下，方便后续朋友了解或协助解决，再次感谢。&lt;/p&gt;
&lt;h2 id="未能解决的问题"&gt;未能解决的问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;安装 Rails 失败&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;执行 `brew install ruby` 成功安装 Ruby 3.3.1，然后执行 `gem install rails -V` 安装 Rails 遇到问题
命令执行后最终会一直 hang 在 creating Makefile 这一步
具体的终端输出请参考: https://gist.github.com/ttys000/72d535a87d966b0383b7b147213b1cab

似乎是安装 `websocket-driver` 这个 gem 失败了
使用 `gem install websocket-driver --debug` 可以看到报了很多 `No such file or directory` 之类的异常
我尝试着用 Homebrew 切换了几个不同的 3.x Ruby 版本，还是会报同样的异常信息
具体日志请参考: https://gist.github.com/ttys000/badd1459f10cc9a033b8826b923ed997
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;asdf&lt;/code&gt; 安装 Ruby 失败&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;执行 `asdf install ruby 3.3.1` 安装 Ruby
遇到了 `unmarshal message: unexpected end of JSON input` 错误
具体日志请参考 https://gist.github.com/ttys000/eb02d20eb0373e68d1ef00376c4486a3
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="TLDR;"&gt;TLDR;&lt;/h2&gt;
&lt;p&gt;如果你遇到问题需要详细了解 Ruby 在 macOS M1 上的安装，那么请阅读本节。我的操作系统版本是 &lt;code&gt;macOS Sonoma 14.5&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="通过版本控制工具 rbenv、rvm、asdf 安装或者使用 ruby-build 安装"&gt;通过版本控制工具 rbenv、rvm、asdf 安装或者使用 ruby-build 安装&lt;/h3&gt;
&lt;p&gt;强烈推荐使用 &lt;code&gt;asdf&lt;/code&gt; 这个版本管理工具，它底层也是使用 ruby-build 进行构建的，但它输出了更完整的日志，方便 debug。&lt;/p&gt;

&lt;p&gt;用法非常简单，请查看&lt;/p&gt;

&lt;p&gt;asdf 官网：&lt;a href="https://asdf-vm.com/guide/getting-started.html" rel="nofollow" target="_blank"&gt;https://asdf-vm.com/guide/getting-started.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mark24 的博客：&lt;a href="https://mark24code.github.io/ruby/2021/12/24/Ruby%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BAasdf+ruby+gem+bundler+%E6%BA%90%E6%9B%BF%E6%8D%A2.html" rel="nofollow" target="_blank"&gt;https://mark24code.github.io/ruby/2021/12/24/Ruby%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BAasdf+ruby+gem+bundler+%E6%BA%90%E6%9B%BF%E6%8D%A2.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GoRails 的教程：&lt;a href="https://gorails.com/setup/macos/14-sonoma#ruby" rel="nofollow" target="_blank"&gt;https://gorails.com/setup/macos/14-sonoma#ruby&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;无论是 rbenv 还是 asdf，这些工具本质上都是从源码构建出 Ruby 的，所以对本地构建环境有一定的依赖和要求，主要有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;readline&lt;/code&gt;, &lt;code&gt;libyaml&lt;/code&gt;, &lt;code&gt;gmp&lt;/code&gt;, &lt;code&gt;openssl@3(only for Ruby 3.x)&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这些依赖库都可以通过 Homebrew 直接安装。如果遇到 openssl 或者 readline 没有找到正确依赖的问题（比如可能你本地有多个 openssl 版本），可以通过配置环境变量的方式解决。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;RUBY_CONFIGURE_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"--with-readline-dir=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;brew &lt;span class="nt"&gt;--prefix&lt;/span&gt; readline&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; --with-openssl-dir=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;brew &lt;span class="nt"&gt;--prefix&lt;/span&gt; openssl@3&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这些库依赖都可以通过在环境变量中配置指定 flag 的方式解决，仔细看构建过程中的终端输出会有以下类似的内容：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;-&amp;gt; ./configure &lt;span class="s2"&gt;"--prefix=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.asdf/installs/ruby/3.2.4"&lt;/span&gt; &lt;span class="nt"&gt;--enable-shared&lt;/span&gt; &lt;span class="nt"&gt;--with-readline-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt/homebrew/opt/readline &lt;span class="nt"&gt;--with-libyaml-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt/homebrew/opt/libyaml &lt;span class="nt"&gt;--with-gmp-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt/homebrew/opt/gmp &lt;span class="nt"&gt;--with-ext&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;openssl,psych,+ &lt;span class="nt"&gt;--with-openssl-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt/homebrew/opt/openssl@3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这显示了当前构建使用的依赖库具体位置（如果没有看到这类信息，请尝试加上 verbose 选项，-v / --verbose 等，具体可以 --help 查看）。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;&lt;code&gt;rustc&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;没错，rustc 是 YJIT 必要的依赖，不装就不会构建 YJIT 功能。rust 相关工具的安装非常简单，这里就不赘述了。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;C 编译工具&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;确保你本地的 Command Line Tool 安装正确，执行以下命令并检查输出：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xcode-select &lt;span class="nt"&gt;-p&lt;/span&gt;

/Applications/Xcode.app/Contents/Developer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有问题可以通过使用 &lt;code&gt;xcode-select&lt;/code&gt; 命令的选项 &lt;code&gt;--install&lt;/code&gt; 安装或 &lt;code&gt;-r, --reset&lt;/code&gt; 重置为默认路径。&lt;/p&gt;

&lt;p&gt;构建日志中可能会显示 llvm 相关的错误，比如：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;configure: error: something wrong with &lt;span class="nv"&gt;LDFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-L/opt/homebrew/opt/llvm/lib"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是因为 Ruby 在构建的过程中需要用到 clang 这个 C 编译器前端工具，如果本地安装并配置了 llvm 可能会导致构建失败。&lt;/p&gt;

&lt;p&gt;请确保使用 Apple clang:&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clang &lt;span class="nt"&gt;--version&lt;/span&gt;

Apple clang version 15.0.0 &lt;span class="o"&gt;(&lt;/span&gt;clang-1500.3.9.4&lt;span class="o"&gt;)&lt;/span&gt;
Target: arm64-apple-darwin23.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并请检查环境变量 &lt;code&gt;LDFLAGS&lt;/code&gt;, &lt;code&gt;CFLAGS&lt;/code&gt;, &lt;code&gt;CPPFLAGS&lt;/code&gt; 中是否含有 llvm 相关的 path，如果有请去掉试试。&lt;/p&gt;

&lt;p&gt;以上就是我遇到并解决过的问题，感谢社区的帮助。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="原帖"&gt;原帖&lt;/h2&gt;
&lt;p&gt;好久没关注 Ruby on Rails 了，前些天看了 Rails 7 的前端 import-map 等前端方案，感慨这个框架居然不仅一直在更新，而且非常与时俱进，于是重新燃起兴趣。&lt;/p&gt;

&lt;p&gt;结果花了一上午的时间完成了「从想玩」到「放弃」&lt;/p&gt;

&lt;p&gt;没想到都 2024 年了，在 macOS M1 安装 Rails 如此困难，我的系统版本是 macOS Sonoma 14.5&lt;/p&gt;

&lt;p&gt;我尝试了：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rvm install script, default install with Ruby and Rails（过程中因为没有 arm64 binary，需要从源码编译 Ruby 失败，有看到 openssl 依赖报错，尝试解决未果）&lt;/li&gt;
&lt;li&gt;rbenv install ruby（也是报编译错误，没细看）&lt;/li&gt;
&lt;li&gt;brew install ruby（成功安装 ruby 3.3.1，但是接下来 gem install rails 会 hang 在 creating Makefile 这一步，搞不懂为什么，加上 sudo 或者 --user-install 都一样不行）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;等，但都失败了。&lt;/p&gt;

&lt;p&gt;然后尝试找一些第三方的 all in one installer，比如 railsinstaller.org 仅支持到 macOS 10.8&lt;/p&gt;

&lt;p&gt;更离谱的是，我居然发现了这个 rubyonmac.dev，99 刀就为了安装好 Ruby 和 Rails？难以置信。&lt;/p&gt;</description>
      <author>ttys000</author>
      <pubDate>Mon, 27 May 2024 13:21:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/43708</link>
      <guid>https://ruby-china.org/topics/43708</guid>
    </item>
  </channel>
</rss>
