Installation von alten „ZIP“-Modulen via Composer in OXID6

Es gibt nach wie vor eine Reihe von OXID-Modul-Anbietern die Ihre komplette Modul-Distribution durch per Mail versendete ZIP-Dateien lösen. Die Module müssen dann in aktuellen OXID Shops (>= Version 6.0) wie in den alten OXID-Shops (<= Version 4.10) per FTP bereitgestellt und anschließend installiert werden.
Damit dennoch eine Automation oder ein Deployment mit modernen Continious Integration Tools möglich gemacht werden kann, hilft uns die Möglichkeit von Composer eigene Repositories in einem lokalen Verzeichnis zu platzieren.

Als Beispiel nehme ich zwei Module der Anbieter Digidesk und Customweb (sellxed). Beide sind insofern interessant, da Digidesk seine Module mit ionCube verschlüsselt verteilt und Customweb seine Module zwar nicht verschlüsselt aber sogar noch komplett ohne composer.json ausliefert.

Die Idee ist es, parallel zu den OXID6-Standardverzeichnissen „source“ und „vendor“ ein weiteres Verzeichnis „extensions“ anzulegen und dort alle lokalen Repositories bereitzustellen. Die Struktur sieht dann für ein Gutscheinmodul von Digidesk und ein Payment-Modul von Saferpay wie folgt aus:

source\...
vendor\...
extensions\digidesk\dd_base\...
extensions\digidesk\dd_coupons_selling\...
extensions\customweb\lib\...
extensions\customweb\saferpaycw\...

Die beiden Module von Digidesk haben jeweils bereits eine eigene composer.json. Darum reicht es, in die composer.json vom Shop folgendes zu ergänzen:

{
    ...
    "repositories": [
        ...
        {"type": "path", "url": "extensions/digidesk/*", "options": {"symlink": false}}
        ...
    ],
    ...
    "require": {
        ...
        "digidesk/base": "2.1.*",
        "digidesk/couponselling": "3.4.*"
        ...
    },   
    ...
}

Für Saferpay muss vor diesem Schritt den beiden Repositories noch zusätzlich eine eigene composer.json bereitgestellt werden. Für das Modul „saferpaycw“ mit folgendem Inhalt:

extensions\customweb\saferpaycw\composer.json
{
  "name": "customweb/saferpaycw",
  "description": "Saferpay Payment",
  "type": "oxideshop-module",
  "keywords": [
    "oxid",
    "modules",
    "eShop"
  ],
  "license": [
    "GPL-3.0",
    "proprietary"
  ],
  "extra": {
    "oxideshop": {
      "target-directory": "customweb/saferpaycw"
    }
  },
  "version": "4.0.250"
}

Bei der Version orientiere ich mich an der Version des Moduls.

Sowohl Digidesk als auch Customweb stellen neben den eigentlichen Modul ein zweite „Schweizer Taschenmesser“ Scripte-Sammlung bereit. Dort versammeln sich Methoden, die von den Modulentwicklern immer wieder in allen Modulen verwendet werden. Digidesk hat dafür ein zweites Modul „dd_base“ erstellt. Saferpay im Gegensatz dazu eine Sammlung von PHP-Klassen die kein eigenständiges Modul darstellen. Darum werden wir als Repository-Typ hier den composer-Standard „library“ verwenden. Die composer.json für die „lib“-Bibliothek lautet nun:

extensions\customweb\lib\composer.json
{
  "name": "customweb/lib",
  "description": "Saferpay Payment Library",
  "type": "library",
  "keywords": [
    "oxid",
    "modules",
    "eShop"
  ],
  "license": [
    "GPL-3.0",
    "proprietary"
  ],
  "version": "4.0.250"
}

Nach Originalanleitung sollte die Sammlung („lib“-Ordner) unterhalb von source… per Hand abgelegt werden und nicht wie es composer macht, im Verzeichnis „vendor“. Darum passen wir eine einzige Datei in dem Modul per Hand an, in der die Pfadangabe fest verdrahtet ist:

extensions\customweb\saferpaycw\classes\SaferpayCwHelper.php

ca. Zeile 273, wird getauscht:

<?php
...
require_once dirname(__FILE__) . '/../../../../lib/loader.php';
...

gegen

<?php
...
require_once dirname(__FILE__) . '/../../../../../vendor/customweb/lib/loader.php';
...

In die Shop-composer.json ergänzen wir nun:

{
    ...
    "repositories": [
        ...
        {"type": "path", "url": "extensions/customweb/*", "options": {"symlink": false}}
        ...
    ],
    ...
    "require": {
        ...
        "customweb/lib": "v4.0.*",
        "customweb/saferpaycw": "v4.0.*"
        ...
    },   
    ...
}

Kommt nun eine neue Version des Saferpay-Moduls erledige ich folgende Schritte:
1) Den Inhalt der folgenden Ordner bis auf die composer.json löschen und mit den neuen Inhalten aus dem neuen ZIP befüllen:

extensions\customweb\lib\...
extensions\customweb\saferpaycw\...

2) Anschließend die Versionen in den beiden composer.json anpassen. Aus Version 4.0.250, wird 4.0.251 (je nachdem welche Version sich in dem ZIP befindet.
3) Die SaferpayCwHelper.php wie oben beschrieben anpassen. Dann das composer update und install.

Bei Digidesk ist das Verfahren noch einfacher. Hier folgt nur der komplette Inhaltetausch der beiden folgende Ordner. Im Anschluss dann das composer update und install.

extensions\digidesk\dd_base\...
extensions\digidesk\dd_coupons_selling\...

Funktioniert das Prozedere lokal erst einmal, dann kann nun in Abhängkeit der weiteren genutzten Tools der extensions-Ordner einfach mit in das Continious Integration Verfahren einbezogen werden. Die Tools kopieren vor dem Ausführen der Installations- und Migrationsscripte, den „extensions“-Ordner einfach mit.