Updatesichere Composer Installation

Moin liebe Shopware Gemeinde,

ich habe via composer install ein Modul installiert, das ich für mein Plugin benötige. Allerdings wird dies bei jedem Update von Shopware überschrieben, so dass ich dies danach jedesmal neu einbinden muss.

 

Wie sieht die Integration im Composer aus, damit Shopware dies beim Update nicht überschreibt ?

Push, weil ich genau das gleiche Problem habe Wearing-Sunglasses

Habe drüber nachgedacht, ob man über die install-Methode des plugins nicht über phps „shell_exec“ composer ausführen könnte. Könnte das funktionieren?

Hast Du schon mal versucht in Deinem Plugin eine eigent composer.json-Datei anzulegen? Damit kannst Du dann die Dependencies Deines Plugins komplett separat von Shopware verwalten.

reicht das aus? die eigentlichen dateien, die ausgeführt werden, fehlen dann doch immer noch; oder nicht?

Gibts irgendwo von Shopware ne Anleitung wie das strukturell aufgebaut sein muss ?

Wo man die vendor Files und die composer.json ablegen muss, damit dies autom. eingebunden werden ?

Schau dir das doch mal beim Profiler an: https://github.com/shyim/shopware-profiler

Da funktioniert das auch einwandfrei.

Das hängt etwas vom letztendliche Einsatzzweck ab. 

Willst Du Dein Plugin an dritte Ausliefern musst Du vermutlich die .lock und das ganze vendor-Verzeichnis mitliefern. Wenn Du ein “privates” Plugin hast könnte es reichen die .lock Datei zu deployen und nur ein install auszuführen.

Nehmen wir mal dieses als Beispiel hier:

 

reicht es da nicht einfach die composer.json php-barcode-generator/composer.json at master · picqer/php-barcode-generator · GitHub

abzulegen ?

Die composer.json des barcode Generators beschreibt nur welche Pakete dieser Generator benötigt. Wenn Du den Generator in Deinem Plugin brauchst, dann musst Du das Github Repo in der composer.json DEINES Plugins angeben (die genaue Syntax ist nicht so spannend, ein composer require picqer/php-barcode-generator reicht im Verzeichnis Deines Plugins wenn dort eine composer.json existiert (wenn nicht, dann einfach eine erzeugen mit composer init).

1 „Gefällt mir“

Du hast mir sehr gut geholfen. Ich habe es hinbekommen :slight_smile:

@Argee schrieb:

Push, weil ich genau das gleiche Problem habe Wearing-Sunglasses

Habe drüber nachgedacht, ob man über die install-Methode des plugins nicht über phps „shell_exec“ composer ausführen könnte. Könnte das funktionieren?

Habe ich probiert, geht wenn man die Plugin-Installation über die cli ausführt, also mit sw:plugin:install PluginName. Dafür reicht ein einfaches 

exec(sprintf(‚composer require %s %s‘, $dependencyName, $dependencyVersion)); in der install Funktion der Plugin Bootstrap.

Über den Plugin-Manager im Backend, funktioniert es leider nicht , selbst wenn man die php binary mit der cli php.ini verwendet, wie folgt

exec(sprintf(‚/usr/bin/php -c /etc/php/7.0/cli/php.ini composer.phar require %s %s --no-interaction --optimize-autoload‘, $dependencyName, $dependencyVersion));

Man sollte dabei bedenken, dass man sich bei Ausführung der Installation über den Plugin-Manager im Shopware-Hauptverzeichnis befindet. D.h. möchte man die vendor files in seinem Plugin Verzeichnis liegen haben, wie bei der von @hsoebbing beschrieben Lösung, muss man beim exec vorher noch ein „cd custom/plugins/PluginName &&“ einfügen (bzw. das pre 5.2 Plugin Verzeichnis). 

Also exec(sprintf(‚cd custom/plugins/PluginName && composer require %s %s‘, $dependencyName, $dependencyVersion));

Vorteil: Die eigenen dependencies laufen getrennt von den von Shopware und werden bei einem Shopware Update nicht aus der composer.json entfernt

Nachteil: Es lädt auch die dependencies erneut herunter die eigentlich schon von Shopware geladen wurden => Overhead

Falls jemand die Lösung dafür kennt wie man das composer require erfolgreich während der Plugin Installation über den Plugin-Manager im Backend laufen lassen kann, wäre ich sehr erfreut diese zu lesen.  Smile