Statische Webseiten mit Cactus erstellen

Letzte Änderung: 03.08.2017

Statische Webseiten haben einige Vorteile. In erster Linie in der Frage der Performance, aber auch der Sicherheit. Allerdings sind sie eben statisch und somit für dynamischen Inhalt nicht geeignet. Und das größte Problem: Jede Änderung muss auf jeder Unterseite nachgezogen werden, was in richtig viel Arbeit ausarten kann.

Dieses Problem lösen statische Webseitengeneratoren ziemlich elegant. Damit baut man praktisch seine Seite lokal auf dem Desktop zusammen, indem man wie üblich den Content erstellt, eine Art Theme drüberstülpt und alle möglichen dynamischen Aktionen während des Build-Vorgangs ausführen lassen kann (wie das Erstellen einer Sitemap usw.). Der Generator baut dann daraus die statischen HTML-Seiten mit den dazugehören Assets und wirft das in ein Verzeichnis aus.

Dieses Verzeichnis legt man dann auf den Webserver. Fertig. Ohne PHP oder einer anderen Skriptsprache und auch ohne Datenbank. Das deckt natürlich nur spezifische Anwedungsfälle ab, ist aber dann ein echter Gewinn.

Im folgenden einige Tipps bei der Arbeit mit dem Seitengenerator Cactus. Der ist frei verfügbar und nutzt Python - somit läuft er überall. Und das besondere Gimmick: Er nutzt Django-Templates und damit habe ich schon immer sehr gern gearbeitet.

Entwicklung mit Cactus und Visual Studio unter Windows

Das folgende kann man garantiert auch anders umsetzen, aber das ist meine Herangehensweise, die sehr gut funktioniert:

  • Unter Windows WSL installieren und auf der bash folgendes machen:
    • In WSL Python 3 und Cactus installieren:
      • sudo apt-get install python3-pip
      • sudo easy_install3 cactus
      • Upgrades von Cactus gehen in Zukunft einfach mit sudo easy_install3 --upgrade cactus
    • Optional: für einige Extras brauchts noch mehr Pakete im WSL: sudo apt-get install closure-compiler yui-compressor (setze ich aber nicht ein)
    • Nun ins Zielverzeichnis wechseln (z.B. /mnt/c/Code/cactus-test/trunk)
    • Ein Projekt erstellen: cactus create cactus-test
    • Das erzeugt nun die Verzeichnisstruktur für das Projekt mit einem Standardtemplate
    • cactus build sollte fehlerfrei durchlaufen (ggf. gibts ein paar Warnungen)
  • In WAMP einen neuen Virtual Host erstellen, der auf das .build-Verzeichnis zeigt, beispielsweise auf C:\Code\cactus-test\trunk\cactus-test\.build.
  • Ein neues Projekt in Visual Studio erstellen:
    • Das Verzeichnis .build sowie plugins/__pycache__ im VS-Projekt ausschließen.
    • SCSS-Struktur aufbauen und was man sonst noch so braucht. Dabei sollte das scss-Verzeichnis im static-Verzeichnis liegen, da sonst die generierten Pfade zu Fonts usw. nicht passen.
    • In Hauptverzeichnis eine Datei cactus-build.bat erstellen mit folgendem Inhalt:
      @echo off
      C:\Windows\sysnative\bash.exe -c "cd /mnt/c/Code/cactus-test/trunk/cactus-test && rm -rf .build && mkdir .build && cactus build"
      exit
      Diese Datei kann nun immer direkt aus Visual Studio heraus ausgeführt werden, um das Projekt bauen zu lassen (rechte Maustaste im Projektmappen-Explorer und "Execute File").
      Wichtig: Unbedingt den Pfad in dieser bat-Datei richtig anpassen! Da steckt ein rm -rf drin und das kann sonst bös enden!
  • Das alles ins SVN einchecken und die üblichen Verdächtigen dabei ignorieren lassen.

Das heißt, in Zukunft muss WSL nicht laufen und es kann direkt in VS entwickelt werden. Nach einer Änderung in VS führt man die bat-Datei aus und testet das Ergebnis lokal mittels des eigenen VHost.

Auf dem Zielserver muss nur der Inhalt vom Verzeichnis .build angeboten werden, z.B. direkt per SVN-Checkout.

.htaccess-Datei einbinden

Von sich aus ignoriert Cactus beim Bauen dot-Files, also z.B. auch eine .htaccess. Will man so eine Datei aber inkludieren, macht man einfach eine Datei plugins/include_htaccess.py mit folgendem Inhalt:

# https://github.com/eudicots/Cactus/issues/223

import os, os.path
import sys
import shutil

def postBuild(site):
    htaccess_path = os.path.join(site.paths['pages'], ".htaccess")
    if os.path.isfile(htaccess_path):
        shutil.copy(htaccess_path, site.paths['build'])

Warnungen in Cactus unterdrücken

Im Moment gibt es einige DeprecationWarnings in Cactus. Irgendein Update wird die in Zukunft bestimmt beheben, aber bis dahin will ich diese Warnungen in meiner lokalen Installation nicht sehen. Die einfachste Methode für den Moment ist, die Datei /usr/local/bin/cactus zu bearbeiten und die erste Zeile anzupassen:

#!/usr/bin/python3 -W ignore::DeprecationWarning

Allerdings muss man das nach jedem Update wiederholen. Ist ja eh nur temporär ...