Dependency Management mit Composer

Seit einiger Zeit beschäftige ich mich mit dem Mirco-Framework Silex von Fabien Potencier und Igor Wiedler.
Dieses Framework verwaltet seine Abhängigkeiten mit Hilfe von Composer. Aus diesem Grund möchte ich hier Composer vorstellen und in einem späteren Artikel Silex noch einmal separat. Mein System ist meine bereits vorgestellte Entwicklungsumgebung in einer virtuellen Maschine mit VirtualBox.

Composer installieren

Folgender Befehl prüft die lokalen PHP-Einstellungen und lädt das PHAR-Paket (PHP-Archiv) vom Server.

curl -s https://getcomposer.org/installer | php

Mit Hilfe des Befehls --install-dir kann auch ein anderes Installationsverzeichnis, als das aktuell verwendete, gewählt werden.

curl -s https://getcomposer.org/installer | php -- --install-dir=bin

Es gibt zwei Möglichkeiten Composer zu verwenden.

  1. Lokal (Projekt-Spezifisch)
  2. Global

Lokal

Soll Composer lokal verwendet werden wird eine Kopie von composer.phar im Stammverzeichnis des Projektes benötigt.

Wichtig hierbei ist, die Datei composer.phar muss auf gleicher Hierarchie-Ebene mit einer composer.json liegen.

├── composer.phar
├── composer.json
├── composer.lock
├── vendor
│   └── ...
└── web
    └── index.php

Danach können die Composer-Befehle mit php composer.phar [--version] verwendet werden.

Global

Wer, wie ich, Composer global verwenden möchte muss folgendes in die Datei ~/.bash_aliases eintragen. Die Datei ~/.bash_aliases wird bei jedem Systemstart/Login eingelesen, so dass alle dort eingetragenen alias Befehle sofort verfügbar sind.

alias sudo="sudo "
alias composer="/var/www/tools/composer/composer.phar"

Hier ist natürlich anzumerken, dass der angegebene Pfad zum Composer-Archiv beliebig anzupassen ist. Nachdem das erledigt ist, wird der Befehl composer global und kann in jedem Verzeichnis ausgeführt werden. Der wohl größte Vorteil ist, dass Composer nun als globale Applikation im System zur Verfügung steht. Der Befehl composer ist nun global verfügbar und benötigt nicht mehr das Schlüsselwort php und die explizite Angabe der composer.phar.

Globale Verwendung in einem Windows-System

Um Composer in einem Windows-System verwenden zu können muss in das Installationsverzeichnis eine composer.bat angelegt werden, die wie folgt auszusehen hat.

@ECHO OFF
SET composerScript=composer.phar php %~dp0%composerScript% %*

Composer verwenden

Zum bequemen verwalten seiner Abhängigkeiten benötigt Composer eine composer.json. In dieser Datei werden alle Pakete mit entsprechenden Stabilitätshinweis deklariert.

{
    "minimum-stability": "dev",
    "require": {
        "silex/silex": "1.0.*"
    }
}

Die definierten Pakete müssen auf packagist.org verfügbar sein, um mit Composer die Abhängigkeiten verwalten zu können. Wir sind schließlich Teil der Open-Source-Community.

Damit Composer einwandfrei funktioniert muss der Server den git-core installiert haben, da für die install- u. update-Routinen git-Befehle verwendet werden. (Je nach Verfügbarkeit kann auch Subversion oder Mercurial eingesetzt werden)

Ein weiteres Feature ist das automatische Laden von eigenen Bibliotheken und Klassen. Durch Angabe des autoload-Schlüssels können, wie im demonstrierten Fall, eigene Namensräume automatisch geladen werden. Es gelten die typischen Regeln zum Speichern eines Namensraums im Dateisystem.

{
    "autoload": {
        "psr-0": { "Acme": "src/" }
    }
}

Nachdem alle deklarierten Abhängigkeiten mit Hilfe von Composer installiert wurden, wird eine composer.lock geschrieben in der alle installierten Abhängigkeiten und Versionen festgehalten sind. Diese Datei sollte in einem Projekt auf jeden Fall mit in die Versionierung, da bei vorhandener composer.lock immer die dort eingetragenen Versionen der Bibliotheken installiert werden.

Fazit

Composer ist im Zusammenhang mit packagist.org eine hervorragende Möglichkeit seine PHP-Projekte auf einfache Art und Weise zu verwalten. Durch die breite Unterstützung durch die Symfony-Komponenten hat die Gemeinschaft um Composer bereits viele Anhänger gefunden. Ich werde, wo es nur geht, Composer einsetzen, denn wenn composer.json und composer.lock in der Versionierung mitgeliefert werden hat jeder Entwickler immer die gleichen funktionierenden Versionen der abhängigen Bibliotheken im Projekt.

Kommentar schreiben

Benutzerdaten
Ihr Kommentar