Zugegeben, ich habe das Thema des Blogs jetzt einige Zeit einfach ruhen lassen. Aber als ich nach einiger Zeit mal wieder etwas schreiben wollte funktionierte Jekyll schlicht nicht mehr. In der Zwischenzeit wurde Fedora mehrfach aktualisiert und möglicherweise auch die Ruby und Gem Pakete die in den Fedora Repos sind.

Ein wenig überraschend ist es, dass ein Syntaxfehler auftritt, obwohl ich die Dateien nie händisch bearbeitet habe. Die Tatsache, dass ich mich nicht Ruby oder Gem beschäftigt habe, macht mir die Fehlerbehebung auch nicht gerade einfacher.

Aber zunächst die Fehlermeldung:

$ bundle exec jekyll serve
Invalid gemspec in [~/.gem/ruby/specifications/ffi-1.11.3.gemspec]: ~/.gem/ruby/specifications/ffi-1.11.3.gemspec:45: syntax error, unexpected '.'
asks>.freeze, ["~> 0.2.4"])
     ^
~/.gem/ruby/specifications/ffi-1.11.3.gemspec:45: syntax error, unexpected ')', expecting '.' or &. or :: or '['
asks>.freeze, ["~> 0.2.4"])
                          ^
~/.gem/ruby/specifications/ffi-1.11.3.gemspec:53: syntax error, unexpected `end', expecting end-of-input
  end
  ^~~
bundler: failed to load command: jekyll (~/bin/jekyll)
Bundler::GemspecError: The gemspec for ffi-1.11.3 at ~/.gem/ruby/specifications/ffi-1.11.3.gemspec was missing or broken. Try running `gem pristine ffi -v 1.11.3` to fix the cached spec.
  ~/.gem/ruby/gems/bundler-2.1.2/lib/bundler/stub_specification.rb:85:in `_remote_specification'
  ~/.gem/ruby/gems/bundler-2.1.2/lib/bundler/remote_specification.rb:104:in `method_missing'
  ~/.gem/ruby/gems/bundler-2.1.2/lib/bundler/rubygems_integration.rb:365:in `block (2 levels) in replace_bin_path'
  ~/.gem/ruby/gems/bundler-2.1.2/lib/bundler/rubygems_integration.rb:365:in `select'
  ~/.gem/ruby/gems/bundler-2.1.2/lib/bundler/rubygems_integration.rb:365:in `block in replace_bin_path'
  ~/.gem/ruby/gems/bundler-2.1.2/lib/bundler/rubygems_integration.rb:402:in `block in replace_bin_path'
  ~/bin/jekyll:25:in `<top (required)>'

Der naheliegenste erste Schritt ist einfach das vorgeschlagene Kommando auszuführen, doch leider ohne Erfolg:

$ gem pristine ffi -v 1.11.3
Invalid gemspec in [~/.gem/ruby/specifications/ffi-1.11.3.gemspec]: ~/.gem/ruby/specifications/ffi-1.11.3.gemspec:45: syntax error, unexpected '.'
asks>.freeze, ["~> 0.2.4"])
     ^
~/.gem/ruby/specifications/ffi-1.11.3.gemspec:45: syntax error, unexpected ')', expecting '.' or &. or :: or '['
asks>.freeze, ["~> 0.2.4"])
                          ^
~/.gem/ruby/specifications/ffi-1.11.3.gemspec:53: syntax error, unexpected `end', expecting end-of-input
  end
  ^~~
ERROR:  While executing gem ... (NoMethodError)
    undefined method `platform' for nil:NilClass

Als nächstes habe ich das versucht ffi zu deinstallieren und dann upzugraden, leider immer mit der gleichen Fehlermeldung. Als nächsten habe ich mir die Gemspec Referenz angesehen. ‘asks’ kommt dort als Schlüsselwort gar nicht vor. Während ich mich frage, wie es dann in die Datei gekommen ist, steht vor der Ursachenforschung erstmal die Fehlerbehebung an. In jedem Fall lohnt sich ein Blick in das Git Repo von FFI. Dort ist allerdings eine Version hinterlegt, die etwas anders aussieht. Trotzdem kann man sehen, dass es ‘asks’ niemals gab. Ein kurzer Check in meinem Verzeichnis zeigt, dass es zwei Versionen gibt:

ffi-1.11.3.gemspec ffi-1.15.5.gemspec

Damit habe ich einfach mal die Dateien verglichen. Neben den zu erwartenden unterschiedlichen Versionsnummern ist dabei vor allem aufällig, das der vor dem ‘asks’ stehende Block in beiden Versionen sehr ähnlich ist, der nach dem asks kommende Teil aber nur in der fehlerhaften Datei existiert und nach einer (teilweisen) Wiederholung des vorherigen Blocks aussieht.

  if s.respond_to? :add_runtime_dependency then
    s.add_development_dependency(%q<rake>.freeze, ["~> 12.1"])
    s.add_development_dependency(%q<rake-compiler>.freeze, ["~> 1.0"])
    s.add_development_dependency(%q<rake-compiler-dock>.freeze, ["~> 0.7.0"])
    s.add_development_dependency(%q<rspec>.freeze, ["~> 2.14.1"])
    s.add_development_dependency(%q<rubygems-tasks>.freeze, ["~> 0.2.4"])
  else
    s.add_dependency(%q<rake>.freeze, ["~> 12.1"])
    s.add_dependency(%q<rake-compiler>.freeze, ["~> 1.0"])
    s.add_dependency(%q<rake-compiler-dock>.freeze, ["~> 0.7.0"])
    s.add_dependency(%q<rspec>.freeze, ["~> 2.14.1"])
    s.add_dependency(%q<rubygems-tasks>.freeze, ["~> 0.2.4"])
  end
end
asks>.freeze, ["~> 0.2.4"])
    end
  else
    s.add_dependency(%q<rake>.freeze, ["~> 12.1"])
    s.add_dependency(%q<rake-compiler>.freeze, ["~> 1.0"])
    s.add_dependency(%q<rake-compiler-dock>.freeze, ["~> 0.7.0"])
    s.add_dependency(%q<rspec>.freeze, ["~> 2.14.1"])
    s.add_dependency(%q<rubygems-tasks>.freeze, ["~> 0.2.4"])
  end
end

Damit ist die Idee für den nächsten Versuch der Fehlerbehebung auch klar gewesen, ich habe einfach versucht den Block ab asks zu entfernen (natürlich habe ich ein Backup der Datei erstellt). Danach habe ich dann via gem cleanup versucht evtl. Probleme mit alten Versionen zu beheben:

$ gem cleanup
Cleaning up installed gems...
Attempting to uninstall public_suffix-4.0.1
Successfully uninstalled public_suffix-4.0.1
Attempting to uninstall listen-3.2.1
Successfully uninstalled listen-3.2.1
Attempting to uninstall jekyll-4.0.0
Successfully uninstalled jekyll-4.0.0
Attempting to uninstall kramdown-2.1.0
Successfully uninstalled kramdown-2.1.0
Attempting to uninstall ffi-1.11.3
Successfully uninstalled ffi-1.11.3
Attempting to uninstall bundler-2.1.2
Successfully uninstalled bundler-2.1.2
Attempting to uninstall terminal-table-1.8.0
Successfully uninstalled terminal-table-1.8.0
Attempting to uninstall mercenary-0.3.6
Successfully uninstalled mercenary-0.3.6
Clean up complete

Uupss… Das war mehr als ich erwartet hatte. Trotzdem, den Syntaxfehler in der ffi Spec habe ich erfolgreich behoben, ffi-1-11.3 wurde problemlos deinstalliert. Wie man der Liste entnehmen kann aber auch jekyll-4.0.0. Bei der aktuellen Arbeit hatte ich sowieso vor jekyll zu aktualiseren, also einfach:

$ gem install jekyll bundler
Successfully installed jekyll-4.2.2
Parsing documentation for jekyll-4.2.2
Done installing documentation for jekyll after 0 seconds
Successfully installed bundler-2.3.17
Parsing documentation for bundler-2.3.17
Done installing documentation for bundler after 0 seconds
2 gems installed

Soweit so gut, aber beim Starten erscheint jetzt diese Fehlermeldung:

$ bundle exec jekyll serve
Could not find jekyll-4.0.0, kramdown-2.1.0, mercenary-0.3.6, terminal-table-1.8.0, public_suffix-4.0.1, listen-3.2.1, ffi-1.11.3 in any of the sources
Run `bundle install` to install missing gems.

Bundle install ist sicherlich nicht das wsa ich will, denn damit würde ich ja die alte Jekyll Version erneut installieren. Also habe ich einfach mal das Gemfile in meinem Webverzeichnis angesehen, und dort ist auch wunderbar dokumentiert, was passiert:

Danach wurde dann tatsächlich Jekyll gestartet. Neben einem Konflikt der gemeldet wurde, erscheint aber auch der Fehler

~/.gem/ruby/gems/jekyll-4.2.2/lib/jekyll/commands/serve/servlet.rb:3:in `require': cannot load such file -- webrick (LoadError)

Trotzdem war ich jetzt guter Dinge, denn genau dieser Fehler wird auf der Jekyll Dok Seite erwähnt. Jekyll Webrick Fehler Ich habe also genau das gemacht, und danach lief alles wieder:

$ bundle add webrick
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Using bundler 2.3.17
Using rb-fsevent 0.10.3
Using http_parser.rb 0.6.0
Using colorator 1.1.0
Using ffi 1.15.5
Using forwardable-extended 2.6.0
Using public_suffix 4.0.2
Using concurrent-ruby 1.1.5
Using eventmachine 1.2.7
Using rexml 3.2.5
Using mercenary 0.4.0
Using liquid 4.0.3
Using unicode-display_width 1.6.0
Using safe_yaml 1.0.5
Using addressable 2.7.0
Using terminal-table 2.0.0
Fetching webrick 1.7.0
Using em-websocket 0.5.1
Using pathutil 0.16.2
Using jekyll-paginate-v2 1.5.2
Using sassc 2.2.1
Using i18n 1.7.0
Using jekyll-sass-converter 2.0.1
Using rouge 3.14.0
Using rb-inotify 0.10.1
Using kramdown 2.4.0
Using listen 3.7.1
Using kramdown-parser-gfm 1.1.0
Using jekyll-watch 2.2.1
Using jekyll 4.2.2
Using jekyll-feed 0.13.0
Using jekyll-seo-tag 2.6.1
Using jekyll-sitemap 1.4.0
Using minima 2.5.1
Installing webrick 1.7.0

$ bundle exec jekyll serve
Configuration file: ~/harald-berghoff.de/_config.yml
            Source: ~/harald-berghoff.de
       Destination: ~/harald-berghoff.de/_site
 Incremental build: disabled. Enable with --incremental
      Generating... 
       Jekyll Feed: Generating feed for posts
        Pagination: found page: index.html
          Conflict: The following destination is shared by multiple files.
                    The written file may end up with unexpected contents.
                    ~/harald-berghoff.de/_site/index.html
                     - index.markdown
                     - ./index.html
                    
                    done in 0.234 seconds.
 Auto-regeneration: enabled for '~/harald-berghoff.de'
    Server address: http://127.0.0.1:4000/
  Server running... press ctrl-c to stop.```

Was bleibt? Ganz offenbar hat ein wildlaufendes Kommando oder Skript von mir einfach mal ein paar Zeilen in der Datei angehangen und damit Probleme verursacht. Ich werde wohl nicht mehr nachvollziehen können welches Kommando das genau war. Das anschliessende Update der Jekyll Version war dagegen recht klar und übersichtlich.