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.

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.