Magento2-環境ごとに異なるモジュールをロードする


7

現在、環境ごとに異なるモジュールをロードする方法はありますか?たとえば、開発環境にいるときのみAlanのCommerceBug拡張機能をロードしますか?

Magento 1と同様に、app / codeのモジュールファイルを.gitignoreできますが、gitを使用してapp / etc / config.phpへの変更を簡単に無視できません。

Magento \ Framework \ App \ DeploymentConfig \ Readerロードメソッドは、ある種のディープマージではなく、array_mergeのみを使用してファイルデータをマージし、同様の場合は例外をスローするため、env.phpで定義されたモジュールをロードすることはできないようですキーが見つかりました。

/**
 * 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 ?: [];
}

https://github.com/magento/magento2/issues/7で@mzeisによって提起された非常に早いgithubの問題を発見しました。これは環境ごとの複数の構成について話しているが、これはクローズされています。

bin / magento module:enableおよびmodule:disableを呼び出すgitフックを実行することは可能ですが、これは本当に環境に依存する構成を実現するための非常に遠回りの方法のようです。

回答:


0

Magentoにモジュールをインストールする両方の方法に基づいてこれに答えます。ただし、どちらの場合も、app / etc / config.phpファイルをgitignoreして、各環境で生成する必要があります。

Composerを使用してインストール

このモジュールは、requireセクションではなくcomposerのrequire-devセクションにインストールする必要があります(これはを使用して行いますcomposer require --dev module/name)。次に、運用環境で実行composer installするときに、--no-devパラメーターを含める必要があります。

app / code / Module / Nameにデプロイすることでインストールされます

このメソッドはM1と同じように処理します。ディレクトリをgitignoreするだけです。


「それを各環境で生成しました」と言ったときに、「app / code / Module / Nameへのデプロイ」がこれを行うコマンドがある場合、どのようにこれに対処しますか?
Martijn Schot 2016年

app / etc / config.phpは、php bin/magento setup:upgradeまたはを実行すると自動生成/更新されますphp bin/magento module:enable <modulename>。モジュールが存在しない(gitignoredした)場合、モジュールはconfig.phpに追加されません(または以前に存在していた場合は削除されます)
Joe Constant

いくつかの異なることを試みた後、ファイルは存在する必要があり、正しく生成するためにモジュール配列に少なくとも1つのエントリが必要です。そうでない場合、例外がスローされます
Martijn Schot

私が最初にこれを行ってから何かが変わったようです。ただし、gitでconfig.phpファイルを追跡しないことを強くお勧めします。環境の最初の実行でのみ問題が発生し、次に、既存のenv.phpを既存のDBとともに使用しようとした場合のみです。その場合は、既存のconfig.phpも使用する必要があります。
ジョー・コンスタント

1

composerを使用してモジュールをインストールしている場合、モジュールを無効にする唯一の方法は、php bin / magento module:disable Vendor_Moduleを展開プロセスのどこかに使用することです。

composerを使用しておらず、モジュールがapp / code / Vendor / Moduleの下にある場合は、vcsでそれを無視する必要があります。これは、そのモジュールのコピーをvcs以外の場所に保存する必要があることを意味します。

2番目のオプションが最善のようです。そのモジュールを実稼働環境で表示またはアクティブにしたくない場合、それは開発ツールと見なすことができ、vcsのプロジェクトの一部であってはなりません。

また、プロジェクトごとではなく、グローバルな無視ファイルでこのタイプのモジュールを無視することをお勧めします。これはスリップを防ぎます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.