Magento2 - Laden verschiedener Module pro Umgebung

7

Gibt es derzeit eine Möglichkeit, verschiedene Module pro Umgebung zu laden, z. B. die CommerceBug-Erweiterung von Alan nur zu laden, wenn ich mich in meiner Entwicklungsumgebung befinde?

Wie in Magento 1 kann ich die Moduldateien in app / code .gitignore, aber ich kann Änderungen an app / etc / config.php nicht einfach über git ignorieren.

Es scheint nicht möglich zu sein, Module zu laden, die in Ihrer env.php als Magento \ Framework \ App \ DeploymentConfig \ Reader definiert sind. Die Lademethode verwendet nur array_merge anstelle einer tiefen Zusammenführung, um die Dateidaten zusammenzuführen, und löst eine Ausnahme aus, wenn dies ähnlich ist Schlüssel gefunden.

/**
 * Loads the configuration file
 *
 * @param string $fileKey
 * @return array
 * @throws \Exception
 */
public function load($fileKey = null)
{
    $path = $this->dirList->getPath(DirectoryList::CONFIG);
    $fileDriver = $this->driverPool->getDriver(DriverPool::FILE);
    $result = [];
    if ($fileKey) {
        $filePath = $path . '/' . $this->configFilePool->getPath($fileKey);
        if ($fileDriver->isExists($filePath)) {
            $result = include $filePath;
        }
    } else {
        $configFiles = $this->configFilePool->getPaths();
        $allFilesData = [];
        $result = [];
        foreach (array_keys($configFiles) as $fileKey) {
            $configFile = $path . '/' . $this->configFilePool->getPath($fileKey);
            if ($fileDriver->isExists($configFile)) {
                $fileData = include $configFile;
            } else {
                continue;
            }
            $allFilesData[$configFile] = $fileData;
            if (!empty($fileData)) {
                $intersection = array_intersect_key($result, $fileData);
                if (!empty($intersection)) {
                    $displayMessage = $this->findFilesWithKeys(array_keys($intersection), $allFilesData);
                    throw new \Exception(
                        "Key collision! The following keys occur in multiple config files:"
                        . PHP_EOL . $displayMessage
                    );
                }
                $result = array_merge($result, $fileData);
            }
        }
    }
    return $result ?: [];
}

Ich habe ein sehr frühes Github-Problem gefunden, das von @mzeis unter https://github.com/magento/magento2/issues/7 angesprochen wurde und das sich mit mehreren Konfigurationen pro Umgebung befasst, das jedoch geschlossen wurde.

Es wäre möglich, einige Git-Hooks durchzuführen, die bin / magento module: enable und module: disable aufrufen, aber dies scheint ein sehr umständlicher Weg zu sein, um eine wirklich umgebungsabhängige Konfiguration zu erreichen.

Martijn Schot
quelle

Antworten:

0

Ich werde dies basierend auf beiden Möglichkeiten der Installation von Modulen in Magento beantworten. In beiden Fällen sollten Sie jedoch die Datei app / etc / config.php gitignore und sie in jeder Umgebung generieren lassen.

Mit Composer installiert

Sie sollten das Modul im Bereich "require-dev" von Composer installieren und nicht im Abschnitt "require" (Sie verwenden dazu composer require --dev module/name). Dann sollten Sie in Ihrer Produktionsumgebung beim Ausführen composer installden --no-devParameter angeben.

Installiert durch Bereitstellung in App / Code / Modul / Name

Sie würden diese Methode genauso behandeln wie in M1. Geben Sie einfach das Verzeichnis ein.

Joe Constant
quelle
Wenn Sie "In jeder Umgebung generieren lassen" sagen, wie würden Sie vorgehen, wenn "Bereitstellen in App / Code / Modul / Name" einen Befehl dazu gibt?
Martijn Schot
app / etc / config.php wird automatisch generiert / aktualisiert, wenn Sie php bin/magento setup:upgradeoder ausführen php bin/magento module:enable <modulename>. Wenn das Modul nicht existiert (Sie haben es gitigniert), wird es nicht zu config.php hinzugefügt (oder es wird entfernt, wenn es zuvor existiert hat)
Joe Constant
Nachdem Sie einige verschiedene Dinge ausprobiert haben, muss die Datei vorhanden sein und mindestens einen Eintrag im
Martijn Schot,
Es scheint, dass sich etwas geändert hat, seit ich das anfangs getan habe. Ich würde jedoch weiterhin dringend empfehlen, die Datei config.php in git nicht zu verfolgen. Sie hätten nur beim ersten Ausführen einer Umgebung ein Problem und dann nur, wenn Sie versuchen würden, eine vorhandene env.php zusammen mit einer vorhandenen Datenbank zu verwenden. Wenn Sie das getan haben, sollten Sie auch die vorhandene config.php verwenden.
Joe Constant
1

Wenn Sie Composer zum Installieren eines Moduls verwenden, können Sie es nur mithilfe des PHP-Bin / Magento-Moduls deaktivieren: Deaktivieren Sie Vendor_Module irgendwo in Ihrem Bereitstellungsprozess.

Wenn Sie Composer nicht verwenden und sich das Modul unter App / Code / Vendor / Module befindet, sollten Sie es in Ihrem VCS ignorieren. Dies bedeutet, dass Sie eine Kopie dieses Moduls an einem anderen Ort als in Ihrem VCS aufbewahren müssen.

Die zweite Option scheint die beste zu sein. Wenn Sie nicht möchten, dass dieses Modul in Ihrer Produktionsumgebung vorhanden oder aktiv ist, kann es als Entwicklungstool angesehen werden und sollte nicht Teil Ihres Projekts in vcs sein.

Ich würde auch empfehlen, diese Art von Modul in Ihrer globalen Ignorierdatei zu ignorieren und nicht pro Projekt. Dies verhindert Ausrutscher.

Vincent Hornikx
quelle