Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

Torben Hartmann


Thoughts, stories and ideas.

Post Cover

PHP-Paketmanagement mit NPM

Ich sitze mal wieder an einem selbstgebastelten Framework und war auf der Suche nach einem vernünftigen Weg die einzelnen Module die innerhalb des Frameworks benutzt werden wartbar zu halten.

Als Beispiel für eine gute Paketverwaltung kam mir direkt npm, der Paketmanager von NodeJS in den Sinn. Über einfache Befehle kann man Pakete laden, aktualisieren und in angegebenen Versionen laden lassen. Der große Vorteil hierbei ist, dass alle installierten Pakete innerhalb einer package.json Datei festgehalten werden, sowie ihre gewünschte Version.

2 Dinge galt es aber bei npm zu lösen, damit es auch für mein PHP-Framework nutzbar war.

1. NPM Pakete werden in der NPM-Registry gespeichert

Um ein npm Modul für andere zur verfügung zu stellen genügt eine package.json Datei und die Eingabe des npm publish Befehls.
Sofern noch kein Modul unter dem in der package.json Datei angegebenen Namen existiert, wird das Modul hochgeladen und kann über npm install direkt herunter geladen werden. Dies macht das Modul aber für die komplette Welt öffentlich zugänglich. Um dies zu umgehen benötigt man 2 Dinge:

  1. Einen scope vor dem ModulNamen
  2. Eine eigene npm Registry

Um einem Modul einen scope zu geben schreibt man vor den eigentlichen Namen ein @scope/. So wird aus modul1 @tollefirma/modul1. Durch die angabe eines Scopes nimmt die npm-Registry das Paket nicht mehr an und npm publish schlägt fehl.

Als einfache Registry eignet sich das npm Modul sinopia

sudo npm install -g sinopia  
sinopia  

Ab diesem Zeitpunkt läuft bereits unser sinopia Server in seiner Standard Konfiguration. Als nächstes erstellen wir einen Account auf den frischen Server und Verknüpfen unseren Scope mit der eigenen Registry

npm login --registry=http://localhost:4873 --scope=@tollefirma  

Als nächstes limitieren wir noch den Zugriff auf die Synopia Instanz indem wir anonymes Laden der Pakete deaktivieren und die Registrierung schließen.

Auf dem Mac bearbeiten wir ~/.config/sinopia/config.yaml und ändern die Werte allow_acces und allow_publish auf $authenticated und max_users auf -1

auth:  
  htpasswd:
    file: ./htpasswd
    max_users: -1
packages:  
  '@*/*':
    # scoped packages
    allow_access: $authenticated
    allow_publish: $authenticated
  '*':
    allow_access: $authenticated
    allow_publish: $authenticated

Danach starten wir sinopia neu um die Änderungen wirksam zu machen.

2. Ordnerstruktur anpassen

NPM speichert seine Pakete im Ordner node_modules. Wenn ein Paket einen Scope besitzt wird es unter node_modules/@sope/ gespeichert. Mein Framework benötigt alle Module in einem Unterverzeichnis mit dem Namen modules. Da ich die Verzeichnisstruktur nicht ändern wollte habe ich durch einen Symbolischen Link das scope verzeichniss auf meinen modules Ordner "umgebogen".

ln -s /pfad/zu/modules/ ./node_modules/@tollefirma  

Nach diesen einfachen Schritten kann ich über npm install @tollefirma/modul1 Module meines Frameworks in verschiedenen Versionen installieren.

Im nächsten Blogpost werde ich noch kurz erleutern, wie man für die eigene Registry noch Gitlab als Authentifizierung verwenden kann.


Über den Autor

Torben Hartmann


Discussions

comments powered by Disqus Impressum