• https://github.com/typeorm/typeorm/issues/4686#issuecomment-528332702

    这个回答提醒了我们,还是要使用有固定团队维护的技术产品。比如 Rails。

  • 确实是。总是出来一堆「现代化的 xxxx」,制造一些新概念,往往还是新瓶装旧酒,质量还不如老的好。

  • JS 圈子营销严重,新出来的工具全都号称次世代产品、颠覆性设计之类的,然后网站都做的非常 fancy。擅长文档营销,写一些看起来很厉害实则全是水文的「Ultimate Guide」和「Comprehensive Guide」。

  • Ruby 打包技术之旅 at 2024年05月29日

    令人头秃的问题。

  • 这个体验看起来好了很多,赞。

  • 是的,应该是编译工具和环境的问题,与上层安装工具无关。

    Homebrew 就是切换版本的话是有一些繁琐,站在很新手的角度来看可能确实如 Mark24 所言。如果 asdf 可以正常工作,我个人还是 prefer asdf 一些。

    用 Docker 的话对于专业的 Rails 工程师也许是好的实践,项目之间隔离的比较干净,然后还可以尽量靠近生产环境,我目前不用有这么几个原因:

    • 我只是玩一下 Rails,没有那么多项目,所以希望开发环境可以尽量轻薄,少依赖其他服务,项目打开随手就用,不是 compose up 若干个容器
    • 如果 Ruby 和 Rails 都在 Docker 里,那写代码的时候最好是 editor 支持 devcontainer 吧,不然开发体验不太好,这又进一步限制了开发工具是吧?
    • 本地没有 Rails,如何创建一个 Rails 项目?先使用某个已经写好的 Compose 启动一个容器,然后再用这个容器创建出新的 Rails 项目容器,就玩一下来说,感觉也挺折腾的

    总的来说 Docker 这个方案不是我想要的那种开发体验。

  • 从完全新手的角度来看,你说的确实有一定说服力。拿我这两天的折腾来说,需要不断的 brew install / uninstall, 安装后需要在 .zshrc 里配置 PATH,卸载后还需要手动清除 /opt/homebrew/lib/ruby 下的残留,如果不熟悉 Homebrew、不熟悉 shell、不认真看 Homebrew 的终端输出的话,可能确实会感觉繁琐又混乱。

    我用了 asdf 后真的是一下就喜欢上了,当即把自己的 nodejs 也换成了 asdf 管理。

    所以这就是为什么我还是仍然纠结在 asdf install ruby 失败的问题上,而不是因为 Homebrew 安装成功了 Ruby 就停止去折腾 asdf。

    TLDR; 这节中,我仍然强烈推荐首选使用 asdf 进行 Ruby 的安装和管理,毕竟很多人直接就成功了,没有遇到编译错误。

  • 好的,谢谢

  • 嗯嗯,好的,谢谢。

  • 是的

  • 是的,如果是对于只想运行 ruby 来说,最好还是有一种办法可以将 app 和 runtime 打包在一起。

  • 新手确实应该直接用 asdf 来尝试安装。 直接用 ruby-build 构建的话,stdout 里看不到 external command error,所以就感觉是一直停留在等待 clang 编译那里。用 asdf 可以看到更多错误信息了,可以尝试解决了至少。

  • 通过 asdf 安装可以看到具体错误是 unmarshal message: unexpected end of JSON input,详细如下:

    asdf install ruby 3.2.4
    
    ==> Downloading ruby-3.2.4.tar.gz...
    -> curl -q -fL -o ruby-3.2.4.tar.gz https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.4.tar.gz
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 19.6M  100 19.6M    0     0  17.6M      0  0:00:01  0:00:01 --:--:-- 17.6M
    ==> Installing ruby-3.2.4...
    ruby-build: using readline from homebrew
    ruby-build: using libyaml from homebrew
    ruby-build: using gmp from homebrew
    -> ./configure "--prefix=$HOME/.asdf/installs/ruby/3.2.4" --enable-shared --with-readline-dir=/opt/homebrew/opt/readline --with-libyaml-dir=/opt/homebrew/opt/libyaml --with-gmp-dir=/opt/homebrew/opt/gmp --with-ext=openssl,psych,+ --with-openssl-dir=/opt/homebrew/opt/openssl@3
    -> make -j 8
    
    BUILD FAILED (macOS 14.5 on arm64 using ruby-build 20240517)
    
    You can inspect the build directory at /var/folders/d5/89cq_k3j2g73crqs3rt_gnfc0000gn/T/ruby-build.20240528102326.67423.7RhdzP
    See the full build log at /var/folders/d5/89cq_k3j2g73crqs3rt_gnfc0000gn/T/ruby-build.20240528102326.67423.log
    

    错误日志:

    -> make -j 8
    Makefile:19118: warning: overriding commands for target `ruby'
    Makefile:309: warning: ignoring old commands for target `ruby'
        BASERUBY = /usr/bin/ruby --disable=gems
        CC = clang
        LD = clang
        LDSHARED = clang -dynamiclib
        CFLAGS = -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wextra-tokens -Wdeprecated-declarations -Wdivision-by-zero -Wdiv-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wundef   -fno-common -pipe 
        XCFLAGS = -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-strict-overflow -fvisibility=hidden -DRUBY_EXPORT -I. -I.ext/include/arm64-darwin23 -I./include -I. -I./enc/unicode/15.0.0 
        CPPFLAGS = -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   
        DLDFLAGS = -L/opt/homebrew/opt/gmp/lib -Wl,-undefined,dynamic_lookup -install_name /Users/peng/.asdf/installs/ruby/3.2.4/lib/libruby.3.2.dylib -compatibility_version 3.2 -current_version 3.2.4  -fstack-protector-strong -framework CoreFoundation  -fstack-protector-strong -framework CoreFoundation  
        SOLIBS = yjit/target/release/libyjit.a -ldl -lobjc -lpthread 
        LANG = en_US.UTF-8
        LC_ALL = 
        LC_CTYPE = en_US.UTF-8
        MFLAGS = - --jobserver-fds=5,6 -j
        RUSTC = rustc
        YJIT_RUSTC_ARGS = --crate-name=yjit --crate-type=staticlib --edition=2021 -g -C opt-level=3 -C overflow-checks=on '--out-dir=/var/folders/d5/89cq_k3j2g73crqs3rt_gnfc0000gn/T/ruby-build.20240528102326.67423.7RhdzP/ruby-3.2.4/yjit/target/release/' ./yjit/src/lib.rs
    2024/05/28 10:24:12 unmarshal message: unexpected end of JSON input
    make: *** [main.o] Error 1
    make: *** Waiting for unfinished jobs....
    Apple clang version 15.0.0 (clang-1500.3.9.4)
    Target: arm64-apple-darwin23.5.0
    Thread model: posix
    InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
    external command failed with status 2
    
    
  • 好的,那可能是我需要多等一会儿。😅

  • 我删掉了整个 /opt/homebrew/lib/ruby 然后重新

    brew install ruby
    gem install rails -V
    

    还是跟原来一样没有进展。

    BTW,版本管理工具我用过 rbenv 和 rvm,应该都已经卸载干净了,仔细检查了配置文件。用它们的问题基本跟手动使用 ruby-build 遇到的问题是一样的,所以我也没再用它们了,在尝试用 ruby-build 构建,目前还没成功。

    详细见 Mark24 的帖子:https://ruby-china.org/topics/43710

  • 使用 ruby-build 构建需要配置 llvm 相关的环境变量嘛? 我执行命令:

    RUBY_CONFIGURE_OPTS="--enable-load-relative --with-static-linked-ext --with-openssl-dir=$(brew --prefix openssl@3)" ruby-build -v 3.3.1 $HOME/portable-ruby
    

    之后,会一直停在这里:

    -> make -j 8
    Makefile:21362: warning: overriding commands for target `ruby'
    Makefile:300: warning: ignoring old commands for target `ruby'
        BASERUBY = /usr/bin/ruby --disable=gems
        CC = clang
        LD = ld
        LDSHARED = clang -dynamiclib
        CFLAGS = -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wextra-tokens -Wdeprecated-declarations -Wdivision-by-zero -Wdiv-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wmisleading-indentation -Wundef  -fno-common -pipe -arch arm64
        XCFLAGS = -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-strict-overflow -fvisibility=hidden -fexcess-precision=standard -DRUBY_EXPORT -I. -I.ext/include/arm64-darwin23 -I./include -I. -I./prism -I./enc/unicode/15.0.0 -I/opt/homebrew/opt/gmp/include
        CPPFLAGS = -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT
        DLDFLAGS = -L/opt/homebrew/opt/gmp/lib -Wl,-undefined,dynamic_lookup -install_name @executable_path/../lib/libruby.3.3.dylib -compatibility_version 3.3 -current_version 3.3.1  -fstack-protector-strong -framework CoreFoundation  -fstack-protector-strong -framework CoreFoundation  -arch arm64
        SOLIBS = -ldl -lobjc -lpthread
        LANG = en_US.UTF-8
        LC_ALL =
        LC_CTYPE = en_US.UTF-8
        MFLAGS = - --jobserver-fds=5,6 -j
        RUSTC = rustc
        YJIT_RUSTC_ARGS = --crate-name=yjit --crate-type=staticlib --edition=2021 -g -C lto=thin -C opt-level=3 -C overflow-checks=on '--out-dir=/var/folders/d5/89cq_k3j2g73crqs3rt_gnfc0000gn/T/ruby-build.20240527230952.4882.rzLkTm/ruby-3.3.1/yjit/target/release/' ./yjit/src/lib.rs
    Homebrew clang version 17.0.6
    Target: arm64-apple-darwin23.5.0
    Thread model: posix
    InstalledDir: /opt/homebrew/opt/llvm/bin
    
  • 哦,检查了一下,这个 gem websocket-driver-0.7.6/ 的 folder 权限确实是错乱了,我手动修复了权限。重新执行 gem install rails -V 之后的输出跟上面那个加了 sudo 的一样了。最终还是 hang 在那里。也许我再多等等。。。

  • 不 sudo 的话会提示没有写权限,如下:

    ERROR:  While executing gem ... (Gem::FilePermissionError)
        You don't have write permissions for the /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/CHANGELOG.md directory.
    
    1. 没有 xcode 提示
    2. 没有
    3. 尝试过了,Command line tools are already installed.
  • Homebrew 安装 ruby 确实没问题,我也成功安装了 ruby-3.3.1,下面是我执行命令 sudo gem install rails -V 的输出,会一直 hang 在那里。

    HEAD https://index.rubygems.org/
    
    # 此处省略很多 200 的 GET 请求
    
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/CHANGELOG.md
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/LICENSE.md
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/README.md
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/ext/websocket-driver/WebsocketMaskService.java
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/ext/websocket-driver/extconf.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/ext/websocket-driver/websocket_mask.c
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver/client.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver/draft75.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver/draft76.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver/event_emitter.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver/headers.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver/hybi.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver/hybi/frame.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver/hybi/message.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver/proxy.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver/server.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/driver/stream_reader.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/http.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/http/headers.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/http/request.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/http/response.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/mask.rb
    /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/lib/websocket/websocket_mask.rb
    Building native extensions. This could take a while...
    current directory: /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/ext/websocket-driver
    ["/opt/homebrew/opt/ruby/bin/ruby", "extconf.rb"]
    creating Makefile
    current directory: /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/ext/websocket-driver
    ["make", "DESTDIR=", "sitearchdir=./.gem.20240527-4605-3b0v07", "sitelibdir=./.gem.20240527-4605-3b0v07", "clean"]
    current directory: /opt/homebrew/lib/ruby/gems/3.3.0/gems/websocket-driver-0.7.6/ext/websocket-driver
    ["make", "DESTDIR=", "sitearchdir=./.gem.20240527-4605-3b0v07", "sitelibdir=./.gem.20240527-4605-3b0v07"]
    
    # 一直卡在这里
    
  • 好的,明白了,谢谢。 我只是为了学习 Rails,使用 asdf 比较合适。

  • 👍,非常详细,我试着操作一下。 新手想玩 Rails 卡在安装上的第一天。。。 构建出的 Portable Ruby 包含 gem 是吗?用这个 gem install rails 不知道能不能成功。 我在 MacOS 14.5 上用 brew install ruby 成功后,gem install rails 会一直卡在 creating Makefile 这一步,不太明白为什么。

  • 谢谢,我看下

  • 是的呢,更何况还有 Rustup 和 Cargo 这么好用的存在。

  • 😅 嗯嗯,看起来是需要的了,根据 4 楼兄弟的方案,目前还是一直卡在 compiling 这一步,--debug 也没看到输出更多信息,就这么卡在这里。

    无语的很,洗澡去了,回来直接用 Docker 吧,我投降了。

  • ruby-3.3.1 - #compiling - please wait

    时间好长哦

  • 谢谢,正在尝试,看起来是 work 的。 不知道安装 Rails 是不是还会 hang 住,brew install ruby 也是成功的,但是接下来安装 Rails 就是一直 hang 在 creating Makefile。

  • 谢谢,可以先过渡一下。 不过本地开发环境我不喜欢用 Docker 或者 VM 什么的。 另外,这么重视程序员体验和开发效率的语言及框架,怎么能容忍本地环境安装这么困难呢。

    (也能理解,可能是社区不太繁荣,没人维护 arm64 相关的 binary 什么的吧,我记得 10 年前我第一次接触 Ruby 和 Rails,还是很顺利的。)

  • 纯粹用爱发电确实不是长久之计,像 Rails 这样最完美了,通过商业产品实现了经济价值,自身保持纯粹的开源。

  • PostgreSQL 神器之 PostgREST at 2024年05月26日

    PostgreSQL 及其生态超强的,supabase 几乎所有产品都是围绕 PostgreSQL 构建的,其中就使用了 PostgREST 提供了 CRUD API。