Tutorial: TYPO3 Extension veröffentlichen – Anleitung für absolute Einsteiger

Du möchtest eine eigene TYPO3 Extension im TYPO3 Extension Repository (TER) veröffentlichen? Hier ein Spickzettel für alle Schritte, die erforderlich sind. Wir fangen mit den absoluten Grundlagen an und möchten den kompletten Prozess erklären – das Tutorial ist für Entwickler gedacht, die zum ersten Mal eine Extension veröffentlichen möchten und keine bis wenig Erfahrungen mit Packagist, Bitbucket (oder GIT) und dem TER haben.

Das Tutorial deckt folgende Schritte ab:

  • Estellen eines öffentlichen Repositories auf bitbucket.org
  • Registrieren der Extension auf packagist.org
  • Aktivierung des Issue-Trackers auf bitbucket.org
  • Anlegen der Webhooks für packagist und intercept.typo3.com
  • Anlegen einer Doku für die TYPO3 Extension und lokales Rendering der Doku mit Docker zur Kontrolle
  • Version-Tags für die Extension setzen und pushen
  • Upload der Extension ins TER, Link zum Repo und Issue-Tracking einrichten

Eine TYPO3 Extension veröffentlichen – aus der „Vogelperspektive“

Es gibt zwei Typen von TYPO3 Entwicklern: Die einen schwören auf composer. Die anderen auf den Extension-Manager. Wie Du sicher gemerkt hast, unterscheidet sich die Installation von TYPO3 bei diesen beiden „Philosophien“ grundlegend.

Die Installation OHNE composer ist die „alte / traditionelle“ Art der TYPO3 Installation. Die Schritte sind für jeden sofort gut verständlich: Ich lade mir das TYPO3 Paket als gezippten Ordner (oder tar) auf meinen Webserver. Der Ordner enthält alle Skripte und Dateien, die ich brauche, um TYPO3 an den Start zu bringen. Extensions kann ich danach einfach über das Backend-Modul „Erweiterungen“ laden und aktivieren.

Bei der composer-Installation arbeitet man fast ausschließlich auf der Kommando-Zeilen-Ebene: Man loggt sich mit dem Terminal der Putty per SSH auf seinen Webserver, kopiert eine Reihe von kryptischen Befehlen in die Konsole und sieht dann einen Haufen Dateien und Pakete von irgendwo aus dem Netz in seine Webverzeichnis fliegen. Möchte ich eine Extensions zu meiner Installation hinzufügen, kann ich danach nicht einfach das Backend-Modul verwenden – ich muss wieder über die Kommandozeile gehen.

Warum das alles wichtig ist?
Du solltest bei dem Veröffentlichen Deiner Extension immer im Blick haben, dass es diese beiden TYPO3-Typen gibt. Deshalb muss Deine Extension an zwei Orten im Netz verfügbar sein:

Bitbucket oder Github – die Grundlage für packagist

TYPO3 im composer-Modus lädt also die Extensions von packagist. Nun, um ganz genau zu sein, liegt Deine Extension später nicht auf packagist selbst – sondern in einem GIT-Repository.
Packagist ist strenggenommen nur eine Art „Inhalts-Verzeichnis“. Auf packagist.org liegt kein einziges Skript selbst. Es ist nur ein Register, in dem Du (und composer) nachschauen kann, wo im Internet das gewünschte Paket zu finden ist. Stelle es Dir als wie eine „Linkliste“ vor: Die Links führen alle zu fremden Webseiten, an denen das gesuchte Skript oder Paket gespeichert ist.
Diese „fremden Webseiten“ sind GIT-Repositories – also ein Cloud-Speicher für Skripte mit vielen zusätzlichen Features. Dein Repository kann in einer Cloud sein, die Du selbst auf Deinem eigenen Server installiert hast – oder Du hast ein (meistens kostenloses) Konto bei einem der vielen externen Anbieter.

Die größten und bekanntesten Anbieter von Repositories sind:

  • bitbucket – kostenlos mit unbegrenzten privaten oder öffentlichen Projekten (Repositories). Kostenpflichtig wird es erst ab einer bestimmten Zahl von Usern, die am gleichen Projek arbeiten können sollen.
  • github mit (inzwischen) ähnlichen Konditionen wie bitbucket.
  • sourceforge – je nach Modell ebenfalls kostenfrei.

Welchen Anbieter Du wählst ist heute mehr oder weniger Geschmackssache. Wir haben unsere meisten Skripte seit Jahren bei bitbucket und sind sehr zufrieden damit.

Kurzer Exkurs: Wozu überhaupt ein GIT-Repository nuten?

Deine Daten in einem GIT zu speichern hat viele, viele Vorteile. Viele denken, ein GIT macht nur Sinn, wenn viele Entwickler in einer großen Agentur zusammen an einem Projekt arbeiten. Aber auch für Einzelkämpfer oder kleine Projekte ist es absolut sinnvoll, direkt beim Aufsetzen eines Projektes ein Repository anzulegen.

Ein Repo ist nicht nur Dein rettendes „Apfel-Z“ (deine „Rückgängig“-Funktion) falls etwas schief geht – es ist die Sicherheit und Kontrolle, was wann am Skript geändert wurde. Schöner Nebeneffekt: Wir haben ganze Webinstallationen, bei denen Hacker Dutzende von Skripten manipuliert hatten, mit nur einem einzigen Befehl wieder „bereinigen“ können.

Eine der wirklich größten Vorteile ist es allerdings, alle Deine Scripte später gebündelt an einem Ort zu haben. Von überall aus auf der Welt kannst Du in Deinen Werken nachschauen, was Du wo wie gemacht hast. Bitbucket ist zu einer Art „Skript-Archiv“ oder Spickzettel für uns geworden.

1. Lege ein Repository für Deine Extension auf bitbucket.org an

Im Schnelldurchlauf (2 min) der Registrierungsprozess und die Einstellungen für Dein Repository auf bitbucket.org:


Dieses Video verweist Sie auf den Service eines Drittanbieters, um Videoinhalte abzuspielen. Dieser Service kann Daten zu Ihren Aktivitäten sammeln. Mit einem Klick auf „Play" werden Sie zu der Webseite des Drittanbieters weitergeleitet, um das Video anschauen können.

Schritt für Schritt Anleitung:

  • Registriere Dich kostenlos bei bitbucket.org.
  • Lege ein neues Repository an. Das Feld „Project name“ dient nur der Übersicht. In einem Project können mehrere Repositories gruppiert werden – ähnlich wie in einem Ordner. Das Feld „Repository name“ entspricht idealerweise dem Namen Deiner TYPO3 Extension.
  • Die Checkbox „Private Repository“ raus nehmen – für eine TYPO3 Extension, muss es ein öffentliches Repository sein. Achte darauf, in deinem Quelltext später keine Passworte, API-Keys oder ähnliches ins Repository zu laden!
  • Wähle links im Menü „Issue tracker“ und stelle ihn auf „Public issue tracker“, damit andere User Dir fehler melden können.
  • Klicke rechts oben auf Dein User-Icon und wähle „Personal Settings“. Gehe dann zu „App Passwords“, setze alle Rechte und lass das Passwort anzeigen. Passwort gut notieren – es lässt sich danach nicht mehr anzeigen!

2. „Pushe“ Deine Daten ins Repository.

Als nächstes möchten wir die Daten aus Deiner TYPO3 Extension zu bitbucket hochladen.

Logge Dich per SSH auf Deinem Server ein und navigiere in den Ordner Deiner Extension unter typo3conf/ext/extensionname/. Nacheinander folgende Befehle in der Konsole ausführen. Achtung: Die URL bei git remote add origin in der zweiten Zeile musst Du anpassen. Du findest die Korrekte URL auf der Startseite Deines Repositories.

git init
git remote add origin https://dein-username@bitbucket.org/dein-username/mydemoext.git
git config core.fileMode false
git add – all && git commit -m"Intial commit"
git push – set-upstream origin master

Deine Daten wurden jetzt ins Repository hochgeladen!
Solltest Du weitere Änderungen machen, genügt ab jetzt für alle zukünftige Pushs:

git add – all && git commit -m"Text mit Info"
git push

3. composer.json für Deine Extension anlegen

Damit Du Dein Repository auf bitbucket.org mit packagist verbinden kannst, musst Du eine composer.json-Datei in Deinem Extension-Ordner anlegen. Die sieht in der Regel so aus – die Namespaces musst Du entsprechend anpassen:

{
   "name": "nng/nnhelpers",
   "type": "typo3-cms-extension",
   "license": "GPL-2.0-or-later",
   "description": "A collection of extremely simplified tools and methods to significantly speed up the development and update of Typo3 extensions.",
   "authors": [],
   "require": {
      "php": ">=7.0",
      "typo3/cms-core": "^9.5 || ^10.4 || ^11.3"
   },
   "autoload": {
      "psr-4": {
         "Deine\\Extension\\": "Classes"
      }
   },
   "autoload-dev": {
      "psr-4": {
         "Deine\\Extension\\Tests\\": "Tests"
      }
   },
   "extra": {
      "typo3/cms": {
         "extension-key": "mydemoext"
      }
   }
}
Test
https://bitbucket.org/typo3-ext/mydemoext/

as

https://packagist.org/api/bitbucket?username=99grad&apiToken=API_TOKEN
dbabcdefghijklmnosf270

git tag v1.0.0
git push origin v1.0.0