Magento2 - Carregando diferentes módulos por ambiente

7

Atualmente, existe uma maneira de carregar módulos diferentes por ambiente, por exemplo, para carregar a extensão CommerceBug de Alan apenas quando estou no meu ambiente de desenvolvimento?

Como no Magento 1, eu posso .gitignore os arquivos dos módulos no app / code, mas não posso ignorar as alterações no app / etc / config.php facilmente via git.

Não parece possível carregar os módulos definidos no seu env.php, pois o método de carregamento Magento \ Framework \ App \ DeploymentConfig \ Reader usa apenas array_merge, em vez de algum tipo de mesclagem profunda, para mesclar os dados do arquivo e lança uma exceção se semelhante chaves são encontradas.

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

Encontrei um problema muito antigo no github levantado pelo @mzeis em https://github.com/magento/magento2/issues/7, que fala sobre várias configurações por ambientes, mas isso foi encerrado.

Seria possível fazer alguns ganchos git que chamam módulo bin / magento: enable e module: disable, mas isso parece uma maneira indireta de obter uma configuração verdadeiramente dependente do ambiente.

Martijn Schot
fonte

Respostas:

0

Vou responder isso com base nas duas formas de instalação de módulos no Magento. No entanto, em ambos os casos, você deve ignorar o arquivo app / etc / config.php e gerá-lo em cada ambiente.

Instalado usando o Composer

Você deve instalar o módulo na seção require-dev do compositor, em oposição à seção require (você faz isso usando composer require --dev module/name). Em seu ambiente de produção, quando você executar composer install, inclua o --no-devparâmetro

Instalado implementando no aplicativo / código / Módulo / Nome

Você lidaria com esse método da mesma forma que em M1. Apenas gitignore o diretório.

Joe Constant
fonte
Quando você diz "gerou em cada ambiente", como você faria isso ao "implantar no aplicativo / código / Módulo / Nome" existe um comando para fazer isso?
Martijn Schot 12/10
O aplicativo / etc / config.php é gerado / atualizado automaticamente quando você executa php bin/magento setup:upgradeou php bin/magento module:enable <modulename>. Se o módulo não existe (você gitignored-lo), então não vai ser adicionado ao config.php (ou ele será removido se existia anteriormente)
Joe Constante
Depois de tentar algumas coisas diferentes, o arquivo não precisa existir e precisa ter mínimo um mínimo de uma entrada na matriz módulo para que ele gera corretamente, caso contrário, ele lança uma exceção
Martijn Schot
Parece que algo mudou desde que eu fiz isso inicialmente. No entanto, eu ainda recomendo não rastrear o arquivo config.php no git. Você só teria um problema na primeira execução de um ambiente e somente se estivesse tentando usar um env.php existente junto com um banco de dados existente. Se você estava fazendo isso, também deveria usar o config.php existente.
Joe Constant
1

Se você estiver usando o compositor para instalar um módulo, a única maneira não-invasiva de desabilitá-lo é usar o módulo php bin / magento: desabilite o Vendor_Module em algum lugar do seu processo de implantação.

Se você não está usando o compositor e o módulo reside em app / code / Vendor / Module, você deve ignorá-lo em seus vcs. Isso implica que você deve manter uma cópia desse módulo em outro lugar que não seja no seu vcs.

A segunda opção parece ser a melhor. Se você não deseja que esse módulo esteja presente ou ativo em seu ambiente de produção, ele pode ser visto como uma ferramenta de desenvolvimento e não deve fazer parte do seu projeto no vcs.

Também aconselho a ignorar esse tipo de módulo no seu arquivo global de ignorados, e não por projeto. Isso evita falhas.

Vincent Hornikx
fonte