it-swarm.com.de

Hinzufügen einer Bibliothek zu einem Modul mit composer

Ich arbeite an einem Modul, für das eine Bibliothek erforderlich ist, die sich bereits in Composer befindet.

Ich habe der Datei composer.json meines Moduls eine Zeile hinzugefügt:

"require": {
   "markrogoyski/math-php" : "dev-master"
}

Ich habe den Befehl ausgeführt:

composer update .

und ein "Hersteller" -Verzeichnis wurde im Verzeichnis meines Moduls erstellt und die Dateien wurden heruntergeladen. Wenn ich jedoch der Datei my_module/src/Controller/Test.php eine use-Anweisung hinzufüge, wird folgende Fehlermeldung angezeigt:

----Test.php----

<?php
namespace Drupal\lims\Controller;

use Drupal\Core\Controller\ControllerBase;
use Math\Functions\Map\Single;

class Sample extends ControllerBase {
    public function content() {
        print_r(Single::square([1,2,3,4,5]));
    }
}

Ich sehe den Fehler:

PHP Fatal error:  Class 'Math\\Functions\\Map\\Single' not found in [module path]/src/Controller/Test.php on line 9

Gibt es einen weiteren Schritt, den ich ausführen muss, damit die Bibliothek im richtigen Namespace automatisch geladen wird?

4
Kevin Nowaczyk

Mit composer update Hat Composer das Herstellerverzeichnis und die Datei autoload.php erstellt, die zum automatischen Laden der Bibliothek erforderlich ist. Leider Drupal lädt nicht alle autoload.php-Dateien, die in jedem der Verzeichnisse gefunden wurden, die ein Modul enthalten.

Anstatt die Abhängigkeit Ihres Moduls in die von Drupal verwendete Datei composer.json einzufügen, sollten Sie den Abschnitt extra/merge-plugin so bearbeiten, dass er das Verzeichnis enthält, das die von Ihnen hinzugefügten Module enthält. (Ich habe die Zeile "modules/*/composer.json" hinzugefügt.)

"extra": {
    "_readme": [
        "By default Drupal loads the autoloader from ./vendor/autoload.php.",
        "To change the autoloader you can edit ./autoload.php."
    ],
    "merge-plugin": {
        "include": [
            "core/composer.json",
            "modules/*/composer.json"
        ],
        "recurse": false,
        "replace": false,
        "merge-extra": false
    }
},

Auf diese Weise würde das Ausführen von composer update Aus dem Stammverzeichnis Drupal] die erforderlichen Klassen in das von Drupal verwendete Herstellerverzeichnis hinzufügen und sie automatisch laden.

Wenn die von Ihnen installierten Module alle auf drupal.org gehostet werden (d. H. Sie verwenden kein benutzerdefiniertes Modul), können Sie stattdessen den Abschnitt "Repositorys" so bearbeiten, dass er die folgenden Zeilen enthält.

"repositories": {
    "drupal": {
        "type": "composer",
        "url": "https://packagist.drupal-composer.org"
    }
}

Auf diese Weise können Sie ein auf drupal.org gehostetes Modul hinzufügen, auf dem composer require drupal/module-name Aus dem Stammverzeichnis Drupal] und Composer) installiert wird Abhängigkeiten (in der Datei composer.json des Moduls deklariert) im Herstellerverzeichnis, sodass die Klassen automatisch geladen werden.

6
kiamlaluno

Vorausgesetzt, Sie verwenden die Vorlage Composer für Drupal Projekte :

  1. Führen Sie in Ihrem benutzerdefinierten Modul composer init und benötigen dann ein Paket/eine Bibliothek.
  2. Führen Sie in Ihrem Drupal - Projekt composer require wikimedia/composer-merge-plugin.

    Fügen Sie dann Folgendes zu "extra" Array in Ihrem Drupal Projekt composer.json:

    "merge-plugin": {
        "include": [
            "web/modules/custom/*/composer.json"
        ]
    }
    

    (Siehe Dokumente zu DO: MergePlugin.php .)

    (Siehe Composer-Merge-Plugin auf GitHub.)

  3. Führen Sie in Ihrem Drupal - Projekt composer update.

    Das ist es.

1
leymannx