- 목차 -

안녕하세요! 오늘은 맥북에서 Jekyll 블로그를 시작하려다 겪었던 난관들과 그 해결 과정을 상세히 공유해 보려 합니다. 사실 체념을 하고 맥북으로는 블로그 글을 쓰지 않고 있었습니다. 그래도 이제는 정말 해결해보고 싶었어요! 끝까지 파헤쳐보자는 마음으로 시작하게 됐습니다.

🤯 시작은 Gem::FilePermissionError

Jekyll은 Ruby 기반의 정적 사이트 생성 도구이죠! 지금 현재 제 블로그도 Jekyll로 작성이 되어있고 관련 글도 몇 개 작성했었는데요, Jekyll을 사용하려면 Ruby 환경 설정이 필수죠. 처음은 window에서 시작을 했고 맥북을 사게 돼서 맥북으로 옮겨왔습니다. 맥북에 rbenv로 설치를 하고 나서 💥 처음 gem install bundler 명령어를 입력하자마자 오류가 발생했습니다. 그 때 당시에도 해결해보려고 열심히 나름 노력은 했지만 외면하고 있다가 오늘 처음부터 시작을 해보았습니다.

오늘 제가 처음 받은 오류였습니다.

ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.

📌 오류 원인 분석

permission 오류!! 이 오류는 정말 익숙합니다. 권한문제 ! 이 오류는 맥북에 기본으로 설치된 시스템 Ruby의 특징 때문에 발생합니다. macOS는 시스템의 안정성과 보안을 위해 /Library/Ruby/Gems 같은 시스템 디렉토리에 일반 사용자가 임의로 파일을 쓰거나 변경할 수 없도록 권한을 제한한다고 합니다. 제가 gem install을 했을 때, rbenv가 아닌 이 시스템 Ruby 환경에서 설치를 시도해서 발생한 문제였습니다.

💡 해결 방법

가장 깔끔한 해결책은 rbenv가 관리하는 Ruby 환경을 사용하는 것입니다.

  1. rbenv가 관리하는 Ruby 버전으로 전환:
    rbenv global [원하는 Ruby 버전] # 예: rbenv global 3.2.3
    # 또는 특정 프로젝트 폴더에서만 사용하려면:
    # rbenv local [원하는 Ruby 버전]
    

    저는 이미 rbenv로 Ruby 3.1.4 (나중에는 3.2.3)를 설치해 두었기 때문에 해당 버전으로 전환했습니다.

  2. bundle install 다시 시도: rbenv를 통해 올바른 Ruby 환경으로 전환한 뒤 다시 설치를 시도했습니다.

💥 호환성 지옥

bundlergoogle-protobuf, 그리고 eventmachine

권한 문제는 해결했지만, 새로운 버전 충돌 문제들이 줄줄이 나타났습니다. 여기부터가 정말 지옥이었습니다. 자바스크립트를 주 언어로 사용하는 저는 package.json 으로 몇번 맛보았었죠… 이제 나름 적응이 됐다고 생각했었는데, 여기는 정말 지옥이었어요. 😭

오류 1: bundler와 Ruby 버전 불일치


bundler requires Ruby version \>= 3.1.0. The current ruby version is 2.7.8.225.

📌 오류 원인 분석

이는 설치하려는 bundler 버전이 Ruby 3.1.0 이상을 요구하는데, 당시 Ruby 버전이 2.7.8이었기 때문에 발생한 호환성 문제였습니다.

💡 해결 방법

  1. bundler 구버전 설치 (임시방편) bundler는 하위 Ruby 버전을 지원하는 구 버전이 있습니다. 오류 메시지에서 안내해 준 대로 gem install bundler -v 2.4.22를 시도했습니다.
  2. Ruby 버전 업그레이드 (권장) 결과적으로 Jekyll 설치를 위해 Ruby 버전을 3.1.4 (이후 3.2.3)로 업그레이드하기로 했습니다. rbenv를 사용하면 매우 간단합니다.

     rbenv install 3.2.3 # 원하는 최신 안정 Ruby 3.x 버전
     rbenv global 3.2.3
    

오류 2: google-protobuf와 Ruby 버전 불일치

Ruby 버전을 3.1.4로 올린 후 다시 bundle install을 시도하자 이번에는 google-protobuf라는 Gem에서 문제가 발생했습니다.


google-protobuf requires Ruby version \>= 3.1, \< 3.5.dev. The current ruby version is 2.7.8.225.

📌 오류 원인 분석

이번에도 Gem과 Ruby 버전 간의 호환성 문제였습니다. jekyll의 의존성인 google-protobufRuby 3.1 이상을 요구하는데, 제가 작업하고 있는 환경이 2.7.8로 인식되면서 발생한 것이었습니다.

💡 해결 방법

이 문제는 Ruby 버전을 3.1.4 (또는 3.2.3)로 확실히 전환한 후 다시 bundle install을 시도함으로써 해결되었습니다. rbenv로 Ruby 버전을 전환하고 터미널을 다시 시작하거나 source ~/.zshrc 등으로 환경을 재설정하는 것이 중요했습니다.

오류 3: 고질적인 eventmachine 빌드 실패

가장 오랜 시간 저를 괴롭혔던 오류입니다. 몇 번을 다시 설치하고 삭제하고 권한 찾고 업데이트 해보고 아주 모든 짓을 다했습니다. jekyll 4.x 버전까지 올렸는데도 계속해서 eventmachine-1.2.7이라는 Gem에서 빌드 실패 오류가 발생했습니다.


ERROR: Failed to build gem native extension.
......
make: \*\*\* [binder.o] Error 1

📌 오류 원인 분석

eventmachine-1.2.7은 Ruby 2.x 시절에 주로 사용되던 오래된 Gem입니다. 이 Gem은 C++ 코드를 포함하고 있어 설치 시 사용자의 시스템에서 컴파일(빌드)되어야 하는데, Ruby 3.x 버전의 내부 API 변경 사항과 호환되지 않아 컴파일에 실패하는 것이었습니다. binder.cpp 파일 컴파일 오류는 이 호환성 문제로 인해 발생한 것입니다.

xcode-select --install로 Command Line Tools를 재설치하고, Homebrew로 OpenSSL 경로를 명시해 줘도 해결되지 않았던 이유도 여기에 있었습니다. 기본적인 빌드 도구는 갖춰졌지만, Gem 자체의 소스 코드가 최신 Ruby 버전에 맞지 않았던 것입니다.

💡 해결 방법

eventmachine-1.2.7을 Ruby 3.x에서 빌드하는 것은 거의 불가능 이라고 생각했어요. 따라서 이 Gem에 대한 의존성을 우회하는 방법을 선택했습니다. 이런 버전 문제는 내 문제가 아니라는 것을 일찍 알고, 그에 대응하는 방법을 찾는 것이 답입니다.

  • eventmachine 의존성 우회 (Jekyll Serve의 Live Reload 포기): eventmachine은 주로 jekyll serve 명령의 실시간 브라우저 리로드(Live Reload) 기능을 위해 em-websocket을 통해 사용됩니다. 만약 이 라이브 리로드 기능이 필수가 아니라면, em-websocket의 설치 자체를 막아서 eventmachine의 문제를 우회할 수 있습니다.

    Gemfile을 열어 jekyll-feed 그룹 내부에 다음 한 줄을 추가했습니다.

      # Gemfile
      source "[https://rubygems.org](https://rubygems.org)"
    
      # ... (생략) ...
    
      group :jekyll_plugins do
        gem "jekyll-feed", "~> 0.17"
        # em-websocket의 설치를 의도적으로 막는 라인
        gem 'em-websocket', '>= 99.0', require: false
      end
    
      # ... (생략) ...
    
    • gem 'em-websocket', '>= 99.0': em-websocket 99.0 버전 이상을 찾으라고 지시하여, 실제로는 존재하지 않는 버전을 요구함으로써 Bundler가 이 Gem을 설치할 수 없게 만듭니다.
    • require: false: 만약 다른 Gem이 em-websocket을 필요로 하더라도 Ruby가 자동으로 로드하지 않도록 합니다.

    이후 Gemfile.lock과 Bundler 캐시를 정리한 뒤 다시 bundle install을 실행했습니다.

      rm Gemfile.lock
      bundle cache clean --all
      bundle install
    

🎉 드디어 bundle install

수많은 오류를 만난 끝에, em-websocket의 의존성을 우회하는 방법으로 마침내 bundle install을 성공했습니다!

이제 Jekyll 사이트를 로컬에서 실행할 수 있습니다. 프로젝트 디렉토리로 이동하여 다음 명령어를 입력해줍니다.

bundle exec jekyll serve

마무리 🥺🎊

Jekyll 설치는 간단해 보이지만, Ruby 버전 관리, Gem 의존성, 그리고 시스템 환경 설정이 얽히면서 생각보다 복잡한 오류에 직면할 수 있습니다. 저처럼 eventmachine과 같은 오래된 Gem이 최신 Ruby 환경에서 컴파일되지 않는 문제는 자주 발생하곤 합니다.

이 문제를 해결 하고 나서 다시 한번 마음으로 되뇌이는 문장들

  1. 오류 메시지는 항상 자세히 읽기
    • 모든 해결 방법은 오류 메시지에 들어있다. 👀
  2. rbenv와 같은 버전 관리 도구를 적극적으로 활용하기
    • 저는 이제 nvm 없으면 node 사용 못해요!
  3. GemfileGemfile.lock을 이해하고 적절히 수정하는 것.
    • 처음부터 이쪽 파일을 봤다면 이렇게까지 오래 걸릴 일은 아니었는데…

이 글이 Jekyll 설치 과정에서 어려움을 겪는 다른 분들에게 작은 도움이 되기를 바랍니다.

```