Sprockets ist eine Ruby-Bibliothek zum Kompilieren und Bereitstellen von Web-Assets. Ironischerweise nutzt Redmine selbst die Bibliothek gar nicht. Aber aufgrund der Abhängigkeit durch Ruby, wird sie mit installiert.
Was ist das Problem?
Die Sprockets Entwickler haben eine neues Major Release veröffentlicht. Rails hat als Abhängigkeit Sprockets und unterbindet nicht die Installation eines neuen Major Releases. Redmine ist abhängig von Rails, also hat Redmine automatisch auch das Abhängigkeitsproblem mit Sprockets geerbt. Was bedeutet, dass die Redmine nicht mehr lauffähig ist (also nicht mehr startet), solange die Abhängigkeiten nicht miteinander stimmig sind.
Wer ist betroffen?
- jeder, der Redmine 4 in einer Version installiert, die älter als 4.0.6 ist und die Installation nach dem 8. Oktober 2019 durchführt.
- jeder, der nach dem 8. Oktober 2019 ein Redmine Plugin installiert, welches zusätzliche Gem Pakete benötigt.
- jeder, der eine bestehende Redmine Installation (mit oder ohne Redmine Plugins) mit bundle update nach dem 8. Oktober.2019 aktualisiert.
Wer ist verantwortlich?
Wie oder wer hätte das Problem verhindern können?
Sprockets Entwickler
Nein. Diese haben viel Arbeit investiert und ein neues Feature Release bereit gestellt.
Rails Entwickler
Ja, auf Rails Ebene hätte man eigentlich verhindern müssen, dass die neue Sprockets Version eingebunden wird. Ein wichtiger Grund dafür ist auch, dass sich durch die neue Sprockets Version auch die Mindestvoraussetzung von Ruby auf 2.5.0 erhöht. Mindestvoraussetzung sollten sich eigentlich nur durch Major Releases verändern.
Redmine (Core) Entwickler
Jein. Da man eigentlich nicht damit rechnet, dass sich die Mindestvoraussetzungen ändern, wurde natürlich auch auf Redmine Ebene keine Vorkehrung getroffen, welche die neue Sprockets Version unterbindet.
Da nun aber Rails selbst die neue Sprockets Version zulässt, muss auf Redmine Ebene das Problem gelöst werden:
- entweder durch die Unterbindung der neuen Sprockets Version,
- oder durch Anpassung von Redmine, dass die neue Sprockets Version funktioniert.
Redmine Plugin Entwickler
Nein.
Welche Lösungen gibt es?
a) Update auf Redmine 4.0.6 oder neuer
Das ist die von uns empfohlene Lösung um das Problem zu beheben. Ab Redmine Version 4.0.6 wird nämlich verhindert, dass der Fehler weiterhin auftritt.
b) Neue Sprockets Version verhindern durch Gemfile.local
Wenn die Möglichkeit nicht besteht auf eine neuere Redmine Version zu aktualisieren, kann man über das Anlegen einer Datei names Gemfile.local verhindern, dass Sprockets in einer inkompatiblen Version installiert wird.
Der Inhalt der Gemfile.local könnte so aussehen:
gem 'bundler', '>= 1.12.0'
gem 'sprockets', '~> 3.7.2'
Nachdem Redmine auf eine aktuellere Version gebracht wurde, sollten diese Einträge wieder entfernt werden.
Fazit
Leider kann so ein Fall immer wieder auftreten. Es gibt keine generelle Lösung dies zu verhindern. Aufgrund der komplexen Abhängigkeiten kann so etwas zukünftig auch nicht unterbunden werden. Es ist einfach die Rails/ Redmine/ Redmine-Plugin Architektur, die diese Problematik mit sich bringen.
Weiterführende Informationen
- Auf Github: https://github.com/rails/sprockets
- Auf Redmine.org gibt es diverse Tickets zu dem Thema: #32223, #32300, #32839, #32841