왜 jekyll serve가 안될까?

5 분 소요

요즘 블로그를 좀 뜯어 고치고 있습니다

  • 블로그를 만든 게 약 1년 반정도가 되었습니다. 초기에 이런저런 세팅을 다 해두고, 이후에는 거의 그냥 마크다운으로 글만 써서 올리는 형태로 지속해왔습니다.
  • 그러던 중에, 최근에는 광고를 달아봤습니다. 사실, 광고로 버는 돈은 매우 적고, 이 광고가 오히려 블로그를 보시는 분들에게는 더 귀찮고 번거로운 일이 될 수도 있겠죠.
  • 그런데, 솔직히 저는 좀 궁금했습니다. 내가 지금까지 블로그에 써온 글들이 수익적으로 어떤 의미가 있는 것일까? 또한, 내가 이런 종류의 글쟁이로 직업을 가져가는 것은 가능한 것일까? 라는 것들이요. 간단히 말하면, 이걸로 밥 내가 밥 먹이를 할 수 있을까? 라는 것들이죠.
  • 그래서 광고를 달아놓고 보니, 솔직히 제 블로그가 너무 더럽게 느린 거에요. 광고때문이 아니라 원래도 느렸습니다만, 이전에는 크게 신경쓰지 않았는데, 너무 느린거죠. 그래서 전반적으로 이전에 했던 튜닝을 모두 제외하고, 모두 순정의 상태로 되돌리는 작업을 하고 있었습니다. 그런데.

왜 jekyll serve가 안되는걸까요?

  • 원래는 제 로컬에서 jekyll serve를 통해서 로컬에서 4000 번 포트로 접근해서 블로그의 바뀐 모습을 적용해볼 수가 있었습니다. 그런데, 갑자기 이게 안되는 거죠. bundle exec jekyll serve로 실행을 하면 되긴 되는데, 좀 느리고 번거로워요. 그래서, 이걸 그냥 무시할까 하다가, 아 어떻게든 고쳐야 내 마음이 편하겠다 싶어서 고쳐버리기로 했습니다.
  • 우선 jekyll serve를 그냥 명령하면, 다음과 같은 결과가 나옵니다.
Leeseunghoonui-MacBook-Air:frhyme.github.io frhyme$ jekyll serve
Traceback (most recent call last):
    10: from /usr/local/bin/jekyll:23:in `<main>'
     9: from /usr/local/bin/jekyll:23:in `load'
     8: from /Library/Ruby/Gems/2.6.0/gems/jekyll-4.0.0/exe/jekyll:11:in `<top (required)>'
     7: from /Library/Ruby/Gems/2.6.0/gems/jekyll-4.0.0/lib/jekyll/plugin_manager.rb:52:in `require_from_bundler'
     6: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.0.2/lib/bundler.rb:107:in `setup'
     5: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.0.2/lib/bundler/runtime.rb:26:in `setup'
     4: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.0.2/lib/bundler/runtime.rb:26:in `map'
     3: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.0.2/lib/bundler/spec_set.rb:148:in `each'
     2: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.0.2/lib/bundler/spec_set.rb:148:in `each'
     1: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.0.2/lib/bundler/runtime.rb:31:in `block in setup'
/Library/Ruby/Gems/2.6.0/gems/bundler-2.0.2/lib/bundler/runtime.rb:319:in `check_for_activated_spec!': You have already activated i18n 1.7.0, but your Gemfile requires i18n 0.9.5. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
  • 해석을 해보자면, 너는 벌써, i18n 1.7.0.이 활성화되어 있는데, 너의 Gemfile들은 i18n 0.9.5. 를 필요로 해. 그러니까, 이걸 해결하려면 bundle exec를 니 명령어 앞에 붙여서 실행해 라는 말이죠.
  • 물론, 여기서 말한 것과 같이 bundle exec jekyll serve로 실행해도 실행은 됩니다.

remind what I knew before

  • 전에 배운 것들을 좀 간단하게라도 정리해보겠습니다.
  • Gem: 루비에서 지원하는 라이브러리 관리 시스템입니다. pip, conda, 같은 것들이 모두 여기에 속하죠. 즉, gem install과 같은 방식으로 필요한 라이브러리들을 다운받아서 사용할 수 있습니다.
  • Gemfile: 필요한 Gem들의 규격(스펙)들이 정리된 명세서입니다.
  • bundler: ruby-korea에 정의된 바에 따르면, ‘번들러는 루비 애플리케이션을 위한 일관된 환경을 제공하는데, 필요한 루비젬을 추적하여, 어플리케이션이 항상 정확한 gem과 버전을 쓰도록 환경을 설정하는 것’을 의미합니다. 즉, 앞에서 bundle exec를 앞에 붙여서 명령어를 실행한다면, 해당 라이브러리를 사용하는데 필요한 모든 의존성을 해결하고 그 환경에 맞춰서 실행하도록 한다는 것을 의미하죠. 사실, 이렇게 해도 됩니다만, 저는, 아예 현재 시스템 자체를 뜯어고치고 싶거든요.
  • Gemfile.lock: 젬파일.락 은 번들러가 실행되었을 때 해당 라이브러리를 구동하기 위해서 필요한 정확한 다른 라이브러리들의 버전을 저장해둔 것을 말합니다. 즉, 제가 만약 bundle install을 현재 지킬이 설치되어 있는 라이브러리에서 실행한다면, Gemfile.lock에 정리되어 있는 규격으로부터 정확한 자료를 가져와서, 실행한다는 것이죠. 마찬가지로 bundle exec를 실행한다고 해도, Gemfile.lock에 저장되어 있는 규격으로부터 관련 라이브러리들을 아주 정확하게 가져와서, 실행한다는 것을 의미합니다.
  • 이걸 좀 더 정확하게 보면, Gemfile은 다음과 같고,
source "https://rubygems.org"

gem "jekyll", "~> 3.5"
gem "minimal-mistakes-jekyll"
  • Gemfile.lock부분은 대략 다음과 같습니다. 내용이 길어서, 일부분만 가져왔고, 다음처럼 jekyll을 실행하려면, 필요한 다른 라이브러리들의 규격이 다음과 같다는 것을 정리해둔 것이죠.
jekyll (3.8.6)
    addressable (~> 2.4)
    colorator (~> 1.0)
    em-websocket (~> 0.5)
    i18n (~> 0.7)
    jekyll-sass-converter (~> 1.0)
    jekyll-watch (~> 2.0)
    kramdown (~> 1.14)
    liquid (~> 4.0)
    mercenary (~> 0.3.3)
    pathutil (~> 0.9)
    rouge (>= 1.7, < 4)
    safe_yaml (~> 1.0)
  • jekyll을 실행하기 위해서 정리된 규격 중에서 i18n이라는 라이브러리가 눈에 띕니다. 앞서 나온 에러메세지가 여기서 출발했고, 실제로 Gemfile.lock의 다른 코드를 보면 다음과 같이 작성되어 있습니다. 즉, 현재 Gemfile.lock에 i18n (0.9.5)가 정의되어 있기 때문에, 이 버전이 실행되어야 하는데, 저는 i18n 1.7.0이 이미 활성화되어 있다는 것이죠.
i18n (0.9.5)
    concurrent-ruby (~> 1.0)
  • 그렇다면, i18n을 그냥 지워버리면 되는 것 아닐까요?

uninstall i18n

일단 i18n이 뭔가 하고 찾아봤더니,

Internationalization (i18n) library for Ruby

이라고 합니다. 흠, 더, 무슨 말인지 알 도리가 없네요. 그냥 지워버리기로 합니다.

기존에 깔려 있는 라이브러리를 지우고, jekyll의 규격에 맞춰서 업데이트를 진행합니다.

이렇게 하고 나면, i18n에 대해서 Gemfile.lock에 정의된 규격대로, 다운이 됩니다. 네 필요한 i18n 0.9.5. 버전이 설치되죠.

sudo gem uninstall i18n
bundle update jekyll 
Installing i18n 0.9.5
Using rb-fsevent 0.10.3
Using rb-inotify 0.10.0
Using sass-listen 4.0.0
Using sass 3.7.4
Using jekyll-sass-converter 1.5.2
Using listen 3.2.1
Using jekyll-watch 2.2.1
Using kramdown 1.17.0
Using liquid 4.0.3
Using mercenary 0.3.6
Using pathutil 0.16.2
Using rouge 3.14.0
Using safe_yaml 1.0.5
Using jekyll 3.8.6
Using jekyll-feed 0.13.0
Using sawyer 0.8.2
Using octokit 4.14.0
Using jekyll-gist 1.5.0
Using jekyll-include-cache 0.2.0
Using jekyll-paginate 1.1.0
Using jekyll-sitemap 1.4.0
Using minimal-mistakes-jekyll 4.17.2
Bundler attempted to update jekyll but its version stayed the same
Bundle updated!
  • 그리고 이제 실행을 해봅니다.
jekyll serve 
  • 그러니까, 이제 비슷한데 다른 라이브러리, jekyll-sass-converter가 버전이 다르다고 하네요. 즉, 제 Gemfile.lock에서 정의된 규격은 1.5.2 인데, 실제로는 2.0.1이 실행되고 있다는 것이죠.
  • 따라서, 다시 저걸 지우고, 번들링으로 깔아주면 되는 것이 아닐까 싶습니다.
Traceback (most recent call last):
    10: from /usr/local/bin/jekyll:23:in `<main>'
     9: from /usr/local/bin/jekyll:23:in `load'
     8: from /Library/Ruby/Gems/2.6.0/gems/jekyll-4.0.0/exe/jekyll:11:in `<top (required)>'
     7: from /Library/Ruby/Gems/2.6.0/gems/jekyll-4.0.0/lib/jekyll/plugin_manager.rb:52:in `require_from_bundler'
     6: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.1.0/lib/bundler.rb:149:in `setup'
     5: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.1.0/lib/bundler/runtime.rb:26:in `setup'
     4: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.1.0/lib/bundler/runtime.rb:26:in `map'
     3: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.1.0/lib/bundler/spec_set.rb:147:in `each'
     2: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.1.0/lib/bundler/spec_set.rb:147:in `each'
     1: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.1.0/lib/bundler/runtime.rb:31:in `block in setup'
/Library/Ruby/Gems/2.6.0/gems/bundler-2.1.0/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated jekyll-sass-converter 2.0.1, but your Gemfile requires jekyll-sass-converter 1.5.2. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
  • 지우고 다시 깔아줍니다.
sudo gem uninstall jekyll-sass-converter
sudo bundle update jekyll-sass-converter
  • 네, 다시 잘 깔렸습니다.
Installing jekyll-sass-converter 1.5.2
  • 그리고, 다시 jekyll serve를 실행해 보니, 이번에는 다른 에러 메세지가 발생합니다.
  • 정리하자면, ruby 2.6.0 버전에 정의된 스펙에서는 jekyll-sass-converter이 2.0보다 커야 한다고 하는데, 니가 지금 설치한 버전은 1.5.2. 버전이다. 따라서, Gem::MissingSpecVersionError이 실행되었다. 더 정보가 필요하면, gem env를 실행하라고 되어있네요. 실행해보기로 합니다.
System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/dependency.rb:313:in `to_specs': Could not find 'jekyll-sass-converter' (~> 2.0) - did find: [jekyll-sass-converter-1.5.2] (Gem::MissingSpecVersionError)
Checked in 'GEM_PATH=/Users/frhyme/.gem/ruby/2.6.0:/Library/Ruby/Gems/2.6.0:/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/gems/2.6.0', execute `gem env` for more information
  • 어쩌라는 건지….Gem과 jekyll에서는 필요로 하는 버전이 다릅니다 호호호호호.

wrap-up 및 포기

  • 네 포기했습니다. 그냥 bundle exec jekyll serve를 사용해서, 따로 처리해주기로 했습니다.
  • 뭐, 조금 더 공부를 하면 더 정확하게 할 수도 있을텐데, 그정도의 시간은 없어요. 그래도 오늘 한일들을 정리해보자면,
    • 루비는 gem별로 필요로 하는 라이브러리들이 다르고, 그건 bundle을 통해서 관리될 수 있다.
    • bundle update jekyll등을 통해서 지킬에서 필요로 하는 젬들의 버전을 일괄적으로 다운받을 수 있으며, 그 내용은 Gemfile.lock에 저장된다.
    • 따라서, 같은 버전일지라도 그냥 깔려 있는 gem과 특정 라이브러리에서 필요로 하는 gem의 버전이 다를 경우 그냥 실행해서는 실행이 안될 수 있다.
    • 이는, bundle exec를 앞에 붙이고 시작할 경우, 해당 젬을 실행하기 위해 필요한 정확한 라이브러리들을 가져와서 (일종의 가상환경이라고 생각해도 될듯) 실행하게 해준다. 이렇게 하면 되기는 함.
  • 아무튼, 그냥 bundle exec쓰겠습니다 호호호

댓글남기기