X

Magento 2: Can't run this operation: deployment configuration is absent

Столкнулся с ошибкой "Can't run this operation: deployment configuration is absent" в Magento 2 при попытке выполнить "php bin/magento setup:upgrade" ..

Проект вытянут с гита, файл app/etc/env.php создан и заполнен, но ничего не работает.

Запускаю

php bin/magento setup:upgrade

получаю

Can't run this operation: deployment configuration is absent. Run 'magento setup:config:set --help' for options.

Окей, беру опции вот отсюда и запускаю генерацию конфига

$ php bin/magento setup:config:set \
> --backend-frontname="admin" \
> --db-host="localhost" \
> --db-name="magento2" \
> --db-user="mysql" \
> --db-password="mysql" \                                                                                                                                   
> --session-save="redis"

получаю

You saved the new configuration.

Повторяю команду setup:upgrade, опять та же ошибка.. Ок, чем разбираться что не так, проще глянуть код, открываю

/setup/src/Magento/Setup/Model/Installer.php

вижу это

       $config = $this->deploymentConfig->get(ConfigOptionsListConstants::KEY_MODULES);
        if (!$config) {
            throw new \Magento\Setup\Exception(
                "Can't run this operation: deployment configuration is absent."
                . " Run 'magento setup:config:set --help' for options."
            );
        }

смотрю, что за класс у объекта $this->deploymentConfig, оказывается это

\Magento\Framework\App\DeploymentConfig

так же смотрю константу ConfigOptionsListConstants::KEY_MODULES, она равна "modules"

смотри его метод get

    /**
     * Gets data from flattened data
     *
     * @param string $key
     * @param mixed $defaultValue
     * @return mixed|null
     */    public function get($key = null, $defaultValue = null)
    {
        $this->load();
        if ($key === null) {
            return $this->flatData;
        }

        return isset($this->flatData[$key]) ? $this->flatData[$key] : $defaultValue;
    }

похоже что в flatData нет нашего ключа modules, делаю print_r($this->flatData) - да это именно так.

Пробую выполнить

php bin/magento setup:di:compile

получаю ошибку

You cannot run this command because modules are not enabled. 
You can enable modules by running the 'module:enable --all' command.

Выполняю

php bin/magento module:enable --all

получаю сообщение что все модули включены

The following modules have been enabled:
- Magento_Store                                                                                                                                             
- Magento_Directory                                                                                                                                         
- Magento_Theme                                                                                                                                             
- Magento_Eav   
...
To make sure that the enabled modules are properly registered, run 'setup:upgrade'.
Cache cleared successfully.
Generated classes cleared successfully. Please run the 'setup:di:compile' command to generate classes.
Info: Some modules might require static view files to be cleared. To do this, run 'module:enable' with the --clear-static-content option to clear them.

Выполняю снова

php bin/magento setup:di:compile

получаю целую кучу ошибок

Compilation was started.
Repositories code generation... 1/7 [====>-----------------------]  14% < 1 sec 88.5 MiB

PHP Fatal error:  

Declaration of 
Magento\Customer\Model\ResourceModel\Address\Attribute\Source\Region::getAllOptions() 
must be compatible with 
Magento\Eav\Model\Entity\Attribute\Source\Table::getAllOptions($withEmpty = true, $defaultValues = false) 
in 
/vendor/magento/module-customer/Model/ResourceModel/Address/Attribute/Source/Region.php on line 14

тут все просто, сигнатуры методов не совпадают, правим вручную добавляя указанные сигнатуры. Перезапускаем, опять правим, так все 100500 файлов.

Далее получаю ошибку

[Exception]                                                                                                                                              
Warning: Use of undefined constant MCRYPT_BLOWFISH - assumed 'MCRYPT_BLOWFISH' (this will throw an Error in a future version of PHP) in
/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php on line 56                                                    

Исправляю, устанавливая mcrypt в свой PHP 7.2

Наконец-то получаю, сообщение что все выполнилось

$ php bin/magento setup:di:compile

Compilation was started.
Interception cache generation... 7/7 [============================] 100% 51 secs 506.0 MiB
Generated code and dependency injection configuration successfully.

запускаю опять

php bin/magento setup:upgrade

получаю ошибку

Recoverable Error: ini_set(): Cannot set 'user' save handler by ini_set()
or session_module_name() in 
/vendor/magento/framework/Session/SessionManager.php on line 570

Смотрим код этого файла

    /**
     * Performs ini_set for all of the config options so they can be read by session_start
     *
     * @return void
     */    private function initIniOptions()
    {
        foreach ($this->sessionConfig->getOptions() as $option => $value) {
            $result = ini_set($option, $value);
            if ($result === false) {
                $error = error_get_last();
                throw new \InvalidArgumentException(
                    sprintf('Failed to set ini option "%s" to value "%s". %s', $option, $value, $error['message'])
                );
            }
        }
    }

Можно просто вырезать установку именно этой переменной, но сперва гуглим и видим, что ошибка возникает когда сессии сохраняются в Redis-е

Recoverable Error: session_module_name(): Cannot set 'user' save handler by ini_set() or session_module_name() in app/code/core/Mage/Core/Model/Session/Abstract/Varien.php on line 82
Happens when storing session in DB or in Redis trough Cm_RedisSession

Переключаем место хранения сессий на файлы

php bin/magento setup:config:set --session-save="files"

запускаем снова

php bin/magento setup:upgrade

на этот раз другая ошибка

Warning: ini_set(): A session is active. You cannot change the session module's ini settings at this time 
in /vendor/magento/framework/Session/SessionManager.php on line 129

опять смотрим код, видим

    public function __construct(
...
    ) {
...
        // Enable session.use_only_cookies
        ini_set('session.use_only_cookies', '1');
        $this->start();
    }

ок, надоело, это простой Warning, просто глушим его вот так

    public function __construct(
...
    ) {
...
        // Enable session.use_only_cookies
        @ini_set('session.use_only_cookies', '1');
        $this->start();
    }

запускаем снова

php bin/magento setup:upgrade

на этот раз все начинает работать, но все равно падает с ошибкой

..
Running data recurring...
Warning: count(): Parameter must be an array or an object that implements Countable in 
/vendor/magento/framework/View/Design/Theme/ThemeList.php on line 237

по указаному адресу видим такой код

    protected function _prepareConfigurationData($themePackage)
    {
...
        $parentPathPieces = $themeConfig->getParentTheme();
        if (count($parentPathPieces) == 1) {

в count попадает не верный тип, смотрим getParentTheme(), видим следующее

    public function getParentTheme()
    {
        $parentTheme = $this->_data['parent'];
        if (!$parentTheme) {
            return null;
        }
        return explode(self::THEME_PATH_SEPARATOR, $parentTheme);
    }

все понятно, возвращается null отсюда и ошибка, правим

    protected function _prepareConfigurationData($themePackage)
    {
...
        if ( parentPathPieces && count($parentPathPieces) == 1 ) {

запускаем снова

php bin/magento setup:upgrade

На этот раз получаем то, что ожидали

Processing configurations data from configuration file...
System config was processed

На этом мои приключения не закончились, на фронте я получил

Exception #0 (Magento\Framework\Exception\LocalizedException): Please update your modules: Run "composer install" from the Magento root directory.
The following modules are outdated:
Magento_Cron db schema version: defined in codebase - 2.0.0, currently installed - 2.0.0.1
Magento_Cron db data version: defined in codebase - 2.0.0, currently installed - 2.0.0.1
Vendor_AbstractEntityData db schema version: defined in codebase - 1.1.9, currently installed - 1.2.0
Vendor_AbstractEntityData db data version: defined in codebase - 1.1.9, currently installed - 1.2.0

Но, это уже совсем дургая история..

Категории: Magento
Тэги: magento 2