TYPO3 und Composer – leichter als Gedacht

Vor wenigen Wochen habe ich eine Schulung zum Thema TYPO3 und Deployment bei einem befreundeten Medienunternehmen gegeben. Zum damaligen Zeitpunkt war ich ehrlich gesagt überhaupt nicht mit Composer in Verbindung mit TYPO3 vertraut. Mein Deployment baute sich alle TYPO3 Instanzen automatisch auf, da war kein Composer von Nöten, also spielte ich Schuster bleib bei deinen Leisten.

Bei dem ServerTeam Sprint in Hannover hat mir Peter Niederlag dann mitgeteilt, dass er eigentlich alle Projekte nur noch mit Composer startet, Grund genug mir das jetzt einmal in Ruhe anzuschauen. Meine ersten Probleme habe ich dann durch blödes Nachfragen bei Thomas Maroschik lösen können. Und im OpenSource Gedanken würde ich nun gerne derjenige Sein, der vielleicht jemanden Composer Nahe bringen kann.

Ziel dieses kurzen Artikels wird es sein ein TYPO3 7.6 zu starten, dass eine eigene Projekt Extension als Abhängigkeit erhält und diese Extension soll dann weitere Abhängigkeiten erhalten.

TYPO3 Projekt starten mit Composer

Im Prinzip reicht es aus im Web Verzeichnis ( also meistens htdocs ) eine Datei mit dem Namen composer.json anzulegen in der folgendes zu finden ist:

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://composer.typo3.org/"
        },
        {
          "type": "vcs",
          "url": "git@git.agentur-pottkinder.de:Pottkinder/pk_projects.git"
        }
    ],
    "require": {
        "typo3/cms": "~7.6",
        "pottkinder/pk-projects": "1.0.0"
    }
}

Natürlich sollte man noch Composer installiert haben.

Eine kurze Erklärung, was ich hier mache:

Ich definiere, dass es 2 Repositories gibt aus denen ich mir Informationen hole, der erste Eintrag ist das ComposerVerzeichnis von TYPO3.org, das zweite Repository ist ein Git Repository auf meinem Git Server.
Im nächsten Block erwähne ich einfach nur, dass ich die Version 1.0.0 von meiner eigenem eigenen Paket inkludieren möchte.

Wer jetzt in dem entsprechenden Ordner den Nachfolgenden Befehl startet erhält alle notwendigen Dateien.

composer install

Private Extension aus dem Git mit Composer

In dem oben gezeigten Beispiel hole ich mir meine eigene Extension aus meinem eigenen Git, also keine Veröffentlichung im TER und keine Veröffentlichung auf packagist.com ( Das ist eine Art Repository für Composer Pakete ). Meine Extension ist Grundlegend eine eigene Extension, enthält aber als Definition eine eigene composer.json, ist also ein Composer Paket.

{
  "repositories": [
    {
        "type": "composer",
        "url": "https://composer.typo3.org/"
      }
  ],
  "name": "pottkinder/pk-projects",
  "type": "typo3-cms-extension",
  "description": "",
  "version": "1.0.0",
  "keywords": [
    "TYPO3",
    "extension"
  ],
  "homepage": "https://www.agentur-pottkinder.de",
  "authors": [
    {
      "name": "Bastian Bringenberg",
      "role": "Developer",
      "homepage": "https://www.agentur-pottkinder.de"
    }
  ],
  "license": [
    "GPL-2.0+"
  ],
  "require": {
    "typo3/cms-core": ">=7.6.0,<8.3",
    "derhansen/sf_yubikey": "*",
    "mask/mask": "*",
    "dmitryd/typo3-realurl": "*",
    "lochmueller/sourceopt": "*",
    "markussom/sitemap-generator": "*",
    "aoe/scheduler_timeline": "*"
  },
  "autoload": {
    "psr-4": {
      "Pottkinder\\PkProjects\\": "Classes"
    }
  }
}

Und schon kommen da eine ganze Menge mehr von Feldern, die Bedient werden wollen, aber keine Sorge, so viel ist das gar nicht.

Ich definiere zu erst wieder, dass ich mich auf die TYPO3 Paketliste von TYPO3.org beziehe, dann gebe ich meiner Extension einen Namen und direkt im Anschluss definiere ich, dass der Typ meines Composer Paketes eine Extension ist, indem dort typo3-cms-extension zu lesen ist.

Es folgen ein paar Zeilen, bis wir beim require angekommen sind, diese Zeilen sind allerdings nur dafür da um ein paar Meta Informationen zu geben. Wichtig wird es nun wieder am require. Ich definiere jetzt in meiner Extension, dass ich folgende Extensions zwingend benötige:

  • derhansen/sf_yubikey
  • mask/mask
  • dmitryd/typo3-realurl
  • lochmueller/sourceopt
  • markussom/sitemap-generator
  • aoe/scheduler_timeline

Außerdem benötigt meine Extension das Paket typo3/cms-core, welches aber auch schon von der composer.json die ich anfangs zeigte benötigt wird.

Composer wird nun bei Aufruf des Installationsbefehls rekursiv alle Abhängigkeiten auflösen, also als erstes feststellen, dass TYPO3 benötigt wird, anschließend werden alle Abhängigkeiten von TYPO3 aufgenommen und ebenfalls aufgelöst.
Danach wird die Extension pottkinder/pk-projects  aufgelöst, die wiederum die Extension Liste, die ich oben aufgezählt habe als Abhängigkeiten hat. Vielleicht haben die Extensions selbst weitere Abhängigkeiten, diese werden einfach aufgelöst. Der große Vorteil des Ganzen ist, das wir erst, wenn etwas nicht zusammenpasst benachrichtigt werden und es zu Problemen kommt. Wenn alles zusammen passt, wird automatisch die richtige Version installiert und in einer Datei namens composer.lock installiert.

Wichtiger Hinweis: Die Version unserer Extension ist nicht nur auf die Version in der composer.json zurück zu führen, sondern auch auf die Verwendung von Git Tags, welche die Versionierung übernehmen.

TER Extensions holen

Mit dem einfachen Konsolen Befehl:

composer show --all

Können wir uns eine super lange Liste aller für Composer möglichen Pakete holen, die wir requiren können. Mit nachfolgenden Befehl können wir uns dann noch die möglichen Versionen anschauen: ( als Beispiel die Extension mask )

composer show mask/mask

Unterschied install und update – und was mache ich mit der composer.lock?

Wer versucht hat ein zweites mal den Installationsbefehl zu starten ist vielleicht an diesem Fehler hängen geblieben:

Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.

Das bedeutet, dass die Versionen der einzelnen Pakete, die installiert sind denen, die in der composer.lock stehen entsprechen.

Die composer.lock berechnet, wenn sie nicht existiert oder mit dem Update Befehl zum neu berechnen gezwungen wird, welche Abhängigkeiten wie aufgelöst werden müssen um sauber zusammen arbeiten zu können. Wird eine Konfiguration gefunden, wird diese in die composer.lock geschrieben. Der Befehl composer install versucht jetzt alle Abhängigkeiten aus der Lock Datei zu installieren, da die Abhängigkeiten ja bereits berechnet wurden.

Man kann die composer.lock einfach löschen um alles erneut zu installieren, oder man verwendet die composer.lock dazu die identischen Abhängigkeiten mit seinem Team auszutauschen.

Aussicht und weitere Probleme

Durch Composer können wir nun extrem einfach AutoLoading von Klassen und die Abhängigkeitsauflösung erzwingen, das heißt wir haben ohne große Arbeit alle PHP Dateien, die wir brauchen an genau den Stellen wo sie hin gehören.
Was allerdings nicht geht ist die Konfiguration von TYPO3 oder die Installation von Extensions, da müssen wir auf ein externe Werkzeuge zurück greifen, wenn gewünscht halte ich gerne noch einen Blog Eintrag zum Thema Phing oder Jenkins.
Ansonsten kann ich als Empfehlung noch Helmut Hummels TYPO3 Console empfehlen, das ist zwar so erstmal nur manuell, aber man kommt auf der Kommandozeile erstmal weiter: https://github.com/helhum/typo3_console

Mit Phing oder Jenkins kann man zum Beispiel schöne Lösungen bauen, die auch automatisch per Sass alle CSS Dateien entsprechend bauen.

Anmerkung

Da ich jetzt schon 2 mal gefragt wurde, was eine bestimmte Art von Fehlern zu bedeuten hat:

Das JSON Format trennt nur Elemente einer Ebene mit einem Komma, wenn nach einem Komma die aktuelle Ebene zu geht, ist das Format nicht valide. Ich empfehle Online Validatoren für JSON ( gibts wie Sand am Meer ), wenn sich jemand wirklich unsicher ist, ob seine composer.json richtig formatiert ist. Inhaltlich wird damit natürlich nichts getestet.

Beispiel: https://jsonformatter.curiousconcept.com/

 

Wer noch weitere Fragen oder Probleme hat darf sich jederzeit bei mir melden!

Hey, ich bin Bastian, ein Netzzombie vor dem Herrn. Gemeinsam mit meiner Freundin habe ich 2015 eine Medienagentur mit Schwerpunkt TYPO3 und Hosting gegründet, aber in meiner Freizeit kümmere ich mich um die wirklich wichtigen Dinge: Whiskey, Hörspiele, Comics und Rollenspiel! Das sind meine Laster. Nur nicht in der Reihenfolge...

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

top