Magento 2 4.10.2018

Ungenutzte Kernmodule aus Magento 2 entfernen - so geht es richtig

Inspiriert von einem Tweet von Erik Hansen nutze ich diese Gelegenheit eine Methode zu beschreiben, die wir häufig in unseren Projekten verwenden. Ich habe sie zuerst beobachtet, als mein Kollege Fabian Schmengler sie einsetzte.

Wie in unserem Artikel Cut load times by up to 40% - Why and How to disable unused Magento 2 core modules beschrieben, macht es häufig Sinn Kermodule von Magento 2 zu deaktivieren, um Performance und Sicherheit zu verbessern. In dem Artikel zeigte ich den Standardansatz, wie ein Modul deaktiviert wird:

bin/magento module:disable Magento_Marketplace

Jedoch hat diese Methode einige Nachteile:

  1. Die Moduldateien sind immer noch da, das Modul ist lediglich deaktiviert und kann zu einem späteren Zeitpunkt aus Versehen wieder aktiviert werden.
  2. Wenn man Integration Tests durchführt, sind dabei alle Module aktiv - inklusive der eigentlich deaktivierten Module. Deshalb benötigen wir eine Methode um Module zu entfernen.

Composer, zu Hilfe!

Da diese Module über Composer als Dependencies geladen werden, können wir sie nicht einfach aus der composer.json-Datei entfernen. Stattdessen nutzen wir die replace-Funktion von Composer um sie durch nichts zu ersetzen:

    "require": {
        [...]
    },
    "replace": {
        "magento/module-marketplace": "*"
    },
    "config": {
        [...]

Wenn Sie nun ein composer update aufrufen, werden die definierten Module aus der Codebase entfernt.

Beispiele aus Magento 2.2.3

In einem unserer Projekte nutzen wir dieses Composer Setup:

    "require": {
        [...]
    },
    "replace": {
        "magento/module-admin-notification": "*",
        "magento/module-dhl": "*",
        "magento/module-fedex": "*",
        "magento/module-marketplace": "*",
        "magento/module-multishipping": "*",
        "magento/module-captcha": "*",
        "magento/module-persistent": "*",
        "magento/module-catalog-rule-configurable": "*",
        "magento/module-authorizenet": "*",
        "magento/module-google-adwords": "*",
        "magento/module-sample-data": "*",
        "magento/module-send-friend": "*",
        "magento/module-swagger": "*",
        "magento/module-swatches": "*",
        "magento/module-swatches-layered-navigation": "*",
        "magento/module-tax-import-export": "*",
        "magento/module-google-optimizer": "*",
        "magento/module-ups": "*",
        "magento/module-usps": "*",
        "magento/module-braintree": "*",
        "magento/module-weee": "*",
        "magento/module-signifyd": "*",
        "temando/module-shipping-m2": "*",
        "shopialfb/facebook-module": "*"
    },
    "config": {
        [...]

Erweitertes Beispiel für Magento 2.2.5

Für Magento 2.2.4 und die nachfolgenden Versionen werden Sie wahrscheinlich weitere Module zur Liste hinzufügen wollen. Unsere Liste sieht folgendermaßen aus:

    "require": {
        [...]
    },
    "replace": {
        "magento/module-admin-notification": "*",
        "magento/module-dhl": "*",
        "magento/module-fedex": "*",
        "magento/module-marketplace": "*",
        "magento/module-multishipping": "*",
        "magento/module-captcha": "*",
        "magento/module-persistent": "*",
        "magento/module-catalog-rule-configurable": "*",
        "magento/module-authorizenet": "*",
        "magento/module-google-adwords": "*",
        "magento/module-sample-data": "*",
        "magento/module-send-friend": "*",
        "magento/module-swagger": "*",
        "magento/module-swatches": "*",
        "magento/module-swatches-layered-navigation": "*",
        "magento/module-tax-import-export": "*",
        "magento/module-google-optimizer": "*",
        "magento/module-ups": "*",
        "magento/module-usps": "*",
        "magento/module-braintree": "*",
        "magento/module-weee": "*",
        "magento/module-signifyd": "*",
        "magento/module-analytics": "*",
        "magento/module-catalog-analytics": "*",
        "magento/module-customer-analytics": "*",
        "magento/module-quote-analytics": "*",
        "magento/module-review-analytics": "*",
        "magento/module-sales-analytics": "*",
        "magento/module-wishlist-analytics": "*",
        "temando/module-shipping-m2": "*",
        "dotmailer/dotmailer-magento2-extension": "*",
        "shopialfb/facebook-module": "*",
        "klarna/module-kp": "*",
        "klarna/module-ordermanagement": "*",
        "klarna/module-core": "*",
        "amzn/amazon-pay-and-login-magento-2-module": "*",
        "vertex/module-tax": "*"
    },
    "config": {
        [...]

Erweitertes Beispiel für Magento 2.2.6

Für Magento 2.2.6 ergibt sich gegenüber Magento 2.2.4 und 2.2.5 nur eine Anpassung: Das Amazaon-Pay-Modul wurde in drei Teile aufgeteilt. Daher nutzen wir dort folgenden Block als Basis:

    "require": {
        [...]
    },
    "replace": {
        "magento/module-admin-notification": "*",
        "magento/module-dhl": "*",
        "magento/module-fedex": "*",
        "magento/module-marketplace": "*",
        "magento/module-multishipping": "*",
        "magento/module-captcha": "*",
        "magento/module-persistent": "*",
        "magento/module-catalog-rule-configurable": "*",
        "magento/module-authorizenet": "*",
        "magento/module-google-adwords": "*",
        "magento/module-sample-data": "*",
        "magento/module-send-friend": "*",
        "magento/module-swagger": "*",
        "magento/module-swatches": "*",
        "magento/module-swatches-layered-navigation": "*",
        "magento/module-tax-import-export": "*",
        "magento/module-google-optimizer": "*",
        "magento/module-ups": "*",
        "magento/module-usps": "*",
        "magento/module-braintree": "*",
        "magento/module-weee": "*",
        "magento/module-signifyd": "*",
        "magento/module-analytics": "*",
        "magento/module-catalog-analytics": "*",
        "magento/module-customer-analytics": "*",
        "magento/module-quote-analytics": "*",
        "magento/module-review-analytics": "*",
        "magento/module-sales-analytics": "*",
        "magento/module-wishlist-analytics": "*",
        "temando/module-shipping-m2": "*",
        "dotmailer/dotmailer-magento2-extension": "*",
        "shopialfb/facebook-module": "*",
        "klarna/module-kp": "*",
        "klarna/module-ordermanagement": "*",
        "klarna/module-core": "*",
        "amzn/amazon-pay-sdk-php": "*",
        "amzn/amazon-pay-and-login-with-amazon-core-module": "*",
        "amzn/login-with-amazon-module": "*",
        "amzn/amazon-pay-module": "*",
        "vertex/module-tax": "*"
    },
    "config": {
        [...]

Update

Es gibt eine wertvolle Ergänzung zu diesem Ansatz, entwickelt und geteilt von Cyrill Schumacher. In seinem Blogpost "Magento2 mock classes for removed core modules" beschreibt er, wie man noch mehr Kernmodule aus einem Projekt entfernen kann, wenn man sie nicht benötigt.