Организация конфигов

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
lpoolerl
Сообщения: 27
Зарегистрирован: 2013.10.02, 17:05

Организация конфигов

Сообщение lpoolerl »

Всем доброго времени суток!

Хотел бы написать свой рецепт, поделиться своей идеей, выслушать комментарии (мб это велосипед, говнокод или супер идея).

Итак, при разработке более менее серьезного проекта на Yii - каждую instance проекта нужно накатывать как минимум в 3х местах:

- локально (development) - разработка.
- тестовый сервер (testing) - иногда тестовых серверов может быть несколько.
- production

На каждом из серверов нужны разные настройки:

- соединение с БД, соединение с Memcache, Redis и пр
- логирование - локально вполне можно включать CWebLogRoute, CDbLogRoute и не нужен CEmailLogRoute. А на production не нужен CWebLogRoute, а нужен, например, CEmailLogRoute
- YII_DEBUG - нужно включать локально и выключать на production

Но есть такие настройки в config файлах, которые не относятся к текущему environment, а касаются только приложения, например, "urlManager", "import" и т.д.

Итак мое предложение...
Делаем 3 базовых конфига:
- main.php
- console.php (консольные скрипты)
- test.php (тесты, напр, unit tests)

Эти 3 файла будут в git'e (или другой VCS), но НЕ будут содержать локальные настройки подключения к БД, к Redis и т.д.
В этих 3 файлах будут лишь настройки приложения, например, "homeUrl", "import", "urlManager" и т.д.

Также в git'e в этой же папке будут лежать следующие 3 файла:

main.local.php.example
test.local.php.example
console.local.php.example

Они будут содержать в себе примеры локальных конфигураций.
Их нужно будет скопировать, убрать ".example" и поправить необходимые настройки.
Какие именно необходимые настройки (пример):

log (локально можно включать CDbLogRoute, CWebLogRoute; на production нужен CEmailLogRoute).
коннект к БД, к Redis, к Memcache, к sphinx и пр
gii (на production он не нужен)
...

Также будет сделан отдельный файл debug.local.php.example в папке config.
В нем будут только

defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL', 3);

Его нужно будет также скопировать, убрать ".example" и поправить при необходимости.
Зачем "debug" выносить в отдельный файл? Разработчикам необходим debug локально - так значительно удобнее, а на production он должен быть выключен.
Последний раз редактировалось lpoolerl 2013.10.15, 11:49, всего редактировалось 1 раз.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Организация конфигов

Сообщение yiijeka »

Хм, папки, параметр APP_ENV.... нагружает и запутывает.
Я обошёлся одним main и main.local, который занесён в gitignore.
В main записывается весь конфиг. В main.local только те опции, которые изменены для локального окружения:

main.php

Код: Выделить всё

<?php
$pathLocalConfig = dirname(__FILE__) . '/main-local.php';
return CMap::mergeArray(
    array(
        'basePath' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..',       
        'preload' => array('log'),
        'language' => 'ru',
        'import' => array(
            'common.components.*',
            'common.extensions.*',
            'common.models.*',
            'application.components.*',
            'application.controllers.*',
            'application.models.*',
        ),
        'components' => array(           
            'db' => array(
                'connectionString' => '',
                'username' => '',
                'password' => '',
                'schemaCachingDuration' => YII_DEBUG ? 0 : 86400000, // 1000 days
                'enableParamLogging' => YII_DEBUG,
                'enableProfiling' => YII_DEBUG,
                'charset' => 'utf8',
            ),
            'cache' => extension_loaded('apc') ? array(
                'class' => 'CApcCache',
            ) : array(
                'class' => 'CDummyCache',
            ),
            'log' => array(
                'class' => 'CLogRouter',
                'routes' => YII_DEBUG ? array(
                    array(
                        'class' => 'CWebLogRoute',
                    ),
                ) : array(),
            ),
            'onBeginRequest' => create_function('$event', 'return ob_start("ob_gzhandler");'),
            'onEndRequest' => create_function('$event', 'return ob_end_flush();'),
        ),
    ),
    file_exists($pathLocalConfig) ? require $pathLocalConfig : array()
);
main.local.php - у каждого окружения(сервер, локально, тестовый сервер, другой разработчик, третий разработчик..) свой. Переопределяем или добавляем только, то что нужно:

Код: Выделить всё

<?php
return array(
    'name' => 'Skeleton Airly Local',
    'components' => array(
        'db' => array(
            'connectionString' => 'mysql:host=localhost;dbname=ldb',
            'username' => 'root',
            'password' => '123',
        ),
    )
);
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Организация конфигов

Сообщение lancedevnull »

на самом деле если у вас несколько веток - хотфикс, претест, тест, мастер, дев, еще какието, то одним конфигом не отделаться (не беру в счет локальный)
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Организация конфигов

Сообщение yiijeka »

на самом деле я ветки регулирую с помощью git checkout, а не конфигами ;)
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Организация конфигов

Сообщение lancedevnull »

yiijeka писал(а):на самом деле я ветки регулирую с помощью git checkout, а не конфигами ;)
добавил ты фичу, прописал в конфиге, какого уя ей делать в мастере? а с единым конфигом так и будет :lol:
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Организация конфигов

Сообщение lancedevnull »

на самом деле ответ действительно должен был зависеть от ситуации. Если ты 1 или вас 2-3 человека, то тут прав yiijeka. Ежели все серьезно и есть куча звеньев чтобы попасть в мастер и куча народа пушит и все это проталкивается из ветки в ветку, то тут уж кто на что
lpoolerl
Сообщения: 27
Зарегистрирован: 2013.10.02, 17:05

Re: Организация конфигов

Сообщение lpoolerl »

Спасибо yiijeka за подсказку.
Действительно APP_ENV будет только путать.
Убрал из рассмотрения.

Небольшое уточнение насчет твоих примеров.
Ты в них берешь main-local и затем добавляешь к нему main.php.
Моя идея обратная - брать main.php и с помощью main-local.php переопределять все настройки environment (например, коннект к БД).
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Организация конфигов

Сообщение yiijeka »

"Моя идея" такая же:
В main записывается весь конфиг. В main.local только те опции, которые изменены для локального окружения:
Ответить