Die Berliner User Group hat mich eingeladen etwas über Drupal Tome und statische Websites zu erzählen. Nun, erst mal dachte ich: "Was soll ich groß erzählen?" Der Talk wird schnell erledigt sein.
Tome Static - Fünf Minuten
Tome ist geschrieben von Samuel Mortenson und in seiner einfachsten Funktion erzeugt es statisches HTML aus einer Drupal-Seite, das mit einfachen Mitteln gehostet werden kann. Meine eigene Website ist so ein Beispiel dafür. Die Drupal-Installation läuft lokal auf meinem Rechner und wenn ich einen Blogpost geschrieben habe, dann pushe ich die Änderungen zu meinem Hosting und muss mich nicht um Sicherheitsupdates in der Wildnis kümmern. Das macht die eigene Website wieder extrem entspannt.
So, wie komme ich denn nun zu einer statischen Website mit Drupal? Ganz einfach mit diesen paar Befehlen.
composer create-project drupal/recommended-project tome
cd tome
composer require drupal/tome
vendor/bin/drush pm:install tome_static -y
vendor/bin/drush tome:static -l https://example.com
Fertig. In meinem Drupal Projektverzeichnis gibt es jetzt einen Ordner html in dem die Seite zum hosten bereit ist.
Naja, einige Kleinigkeiten gibt es zu beachten.
- Der Login Link funktioniert nicht. Es empfiehlt sich also den Block für das Menü zu verstecken. Irgendwo gab es die Aussage, dass die Links zur Startseite führen sollen, machen sie aber nicht.
- Formulare funktionieren nicht, wenn sie in Drupal verarbeitet werden sollen logischerweise. Dafür braucht es eine andere Lösung.
- Alle fancy Views Sachen, die mit Ajax arbeiten funktionieren nicht.
- Um eine Suche zu realisieren kann Lunr.js helfen, das eine client-seitige Suche ermöglicht.
- Aggregation der CSS und JS Dateien wird empfohlen, da es sonst zu Fehlern kommen kann.
Anpassen der settings.*.php. Das
config_sync_directory
wird bei Installation in die öffentlichen Dateien geschrieben. Das ist nicht schön. Der hier gezeigte Tome Static Pfad ist wie der Standardpfad. Das wird nur gebraucht, wenn die Seiten woanders gespeichert werden sollen.$settings['config_sync_directory'] = '../config/sync';
# $settings['tome_static_directory'] = '../html';
Das sind die Dinge, die beachtet werden sollen. Aber was hat Tome noch zu bieten?
Gestatten: Tome Sync
Das Submodul Tome Sync geht bei statischem Inhalt noch einen Schritt weiter. Wenn es aktiviert ist, dann synct es komplett alles was auf der Seite passiert direkt in Dateien. Inhalte, Dateien und Konfiguration sind davon betroffen.
vendor/bin/drush pm:install tome_sync -y
vendor/bin/drush tome:export -y
Standardmäßig werden im Projektverzeichnis die Ordner content und files hinzugefügt. Um das zu ändern kann die settings.*.php geändert werden.
# $settings['tome_files_directory'] = '../files';
# $settings['tome_content_directory'] = '../content';
Achtung! Das tome_file_directory
ist nicht gleichzusetzen mit web/sites/default/files
. Tome speichert wirklich nur Datei-Entities, die irgendwie in der Drupal-Seite vorkommen beziehungsweise einen Pfad haben.
Jetzt gibt es einen Export der Drupal-Seite, der versionierbar ist. Das git Repo kann geteilt werden und die Seite installiert werden. Also mutig ran an die Testseite:
vendor/bin/drush sql:drop -y
vendor/bin/drush si --existing-config -y
Ah oh, ein Fehler erscheint
In SiteInstallCommands.php line 177:
Configuration install:standard
The selected profile has a hook_install() implementation and therefore can
not be installed from configuration.
Um das problem zu umgehen muss die Konfiguration manuell geändert werden. In der Datei config/sync/core.extension.yml
gibt es diese Einträge
module:
...
standard: 1000
profile: standard
Die Zeilen mit standard
müssen entfernt werden. Falls ein anderes Profil nicht geht, dann genauso verfahren, denke ich. Und noch mal
vendor/bin/drush si --existing-config -y
vendor/bin/drush tome:import -y
Das sollte ohne Fehler ablaufen und die Seite wieder in den Ausgangszustand versetzen. Wenn Fehler auftreten, dann liegt es meist daran, dass der Contentgraph nicht aufgebaut werden kann, weil alte Inhalte irgendwo drin sind und nicht aufgelöst werden können. In dem Fall beginnt eine kleine Suche durch die exportierten Dateien, die mit UUIDs versehen sind. Das Dateiformat ist übrigens JSON und kann in anderen Buildprozessen verwendet werden. Es gab mal eine Anbindung an Netlify direkt, aber die wird nicht mehr gewartet?
Bevor jetzt alle Tome auf die Produktionsumgebung werfen empfehle ich ausgiebiges Testen, ob in der eigenen speziellen Installation wirklich alles funktioniert. Wenn Module keine ausreichenden Schema-Beschreibungen haben, dann kann der Import fehlschlagen und das contrib Modul erst mal angepasst werden.
Wie gesagt: Ich benutze Tome für diese Website auf der ich schreibe und habe es auch schon Initial-Installation für Kunden benutzt auf deren Seite ich Inhalte erstellt habe während der Entwicklungsphase. Damit das nicht verloren geht steht Tome Sync zur Stelle.