2009-11-22 2 views
0

Какой метод следует использовать для определения того, являюсь ли я в системе dev или производством? В this post from Ray Camden он показывает, как видеть, в какую папку вы находитесь, чтобы это могло быть индикатором.Определение dev vs production

В то время как в dev, я хочу, чтобы ошибка захвата отключена, отсутствующий шаблон отключен, debug = "yes" для cfstoredproc и cfquery, а также всегда перезагружать компоненты onRequestStart.

+0

Является ли URL-адрес разным в каждой среде? Если это так, область CGI имеет ваш ответ. –

ответ

3

У меня есть два подхода к этому, оба из которых хорошо служили. Сначала я начну с самого простого подхода, который я бы назвал «статическим». Я использую это, когда у меня не так много настроек для среды ... может быть, небольшая часть.

Я предполагаю, что у вас есть файл Application.cfc или .cfm для вашего приложения. Там вы можете установить переменную, что-то вроде «application.environment», и по умолчанию она будет установлена ​​на «dev». В вашем приложении вы можете проверить эту переменную, чтобы определить, где вы находитесь.

Когда вы упаковываете приложение для развертывания, вы можете затем изменить этот файл Application.cfc вместо «.

Теперь, это будет раздражать, поэтому я просто использую муравьев для этого. Я просто использовать что-то вроде этого в моем build.xml, который живет в том же каталоге, Application.cfc:

<replace file="Application.cfc" token="DEV" value="PROD" casesensitive="true" /> 

А потом пронестись приложение для развертывания:

<zip destfile="${zipdir}/MyApp-Production.zip"> 
<zipfileset dir="." prefix="MyApp" />   
     </zip> 

Затем я разворачивать молнию , Если я работаю над небольшим проектом, в котором используется FTP, а не с помощью какого-либо корпоративного развертывания enterprise enterprise, то у меня просто будет ANT-задача, что файлы FTP-файлов на мой производственный сервер, и он также выполнит эту замену на Application.cfc и нажмите этот файл тоже.

Для большинства приложений, над которыми я работаю, я использую две таблицы базы данных для управления средами. Мы делаем это, потому что у нас много разных сред, и у каждого из них разные настройки, обычно они сосредоточены вокруг файловой системы и сетевых путей, которые различаются для каждой среды (давайте не будем говорить о том, почему они разные ... полностью отдельное обсуждение). Итак, у нас есть таблица, которую мы называем «AppLocations»:

LocationID | LocName | LocDesc | Настройка1 | Настройка2 | Настройка 3 | ...... 1 | Местные | «Локальная среда» | что угодно ..... 2 | Dev | «Среда разработки» | что угодно .... 3 | Тест | «Испытательная среда» | что угодно .....

и так далее.

Тогда мы еще одна таблица с именем "AppLocationHosts"

LocationID | LocHostName 1 | 'localhost' 2 | 'devservername' 2 | 'otherdevservername' 3 | 'testservername' 3 | 'othertestserver'

и так далее.

затем, в Application.cfc, в onApplicationStart, мы сделать этот запрос

SELECT TOP 1 * 
     FROM AppLocations 
     WHERE LocationID IN (SELECT LocationID FROM AppLocationHosts WHERE LocHostName = <cfqueryparam value="#CGI.HTTP_HOST#" cfsqltype="cf_sql_varchar"/>) 

И оттуда, как только мы знаем, что место мы в основе на матч HTTP_HOST, мы устанавливаем эти «Настройка» столбцы в сферу применения:

<cfloop list="#qryAppPathLocations.ColumnList#" index="ColName"> 
     <cfset application[ColName] = qryAppPathLocations[ColName]> 
    </cfloop> 

Этот подход не для всех, но в нашей странной среде, где консистенция является необычным, это был очень гибкий подход.

Теперь, если у вас буквально есть только две среды, а одна из них - «localhost», а другая - «www.myapp.com», то самым простым было бы просто выполнить проверку на http_host в onApplicationStart и если вы находитесь в «www.myapp.com», то вы делаете свою настройку для конкретной продукции. Возможно, здесь вы задаете такие вещи, как «request.querydebug = true», а затем, когда вы находитесь в производстве, вы отключите это. Тогда ваши запросы могут использовать этот флаг, чтобы определить, включать или отключать отладку для cfstoredproc и query. Хотя я должен сказать, я настоятельно рекомендую против этого.

+0

Wow Marc. Каков ответ. Есть много, о чем можно подумать около Я не думаю, что мне нравится идея использования области cgi. Я хочу, чтобы файл build.xml находился за пределами папки проекта, так что dev и production потенциально могут быть одинаковыми. Переход в базу данных может быть одним вариант, потому что я иду в базу данных уже, чтобы увидеть, если он был перестроен со времени последнего onrequeststart. Я не знаю, почему я не думал об этом раньше. –

+0

Фил, вы можете хранить свои файлы сборки в любом месте. пример выше, я имел это в проекте и, следовательно, zipfil eset dir = ".", потому что "." означает "этот каталог". Но вы можете так же легко сделать , то есть просто указать dir в любой каталог, который вы хотите заархивировать. –

0

Возможно ли получить каталог текущего приложения?


Рассмотрим структуру каталогов для различных "экземпляров" вашего приложения:

/home/deploy/DevLevel.0/MyApp
серийная версия

/дом/развернуть /DevLevel.1/MyApp
Предварительный просмотр или постановка Версия

/home/deploy/DevLevel.2/MyApp
Разрабатываемая версия


Если вы можете прочитать путь к текущему приложению, легко найти число после DevLevel. С этим в руке (устанавливается как глобальная переменная/постоянная), использовать его, чтобы изменить параметры или поведение во время выполнения:

DevLevel == 0 means "Production" 
DevLevel >= 1 means "Development" 

Например, в коде авторизации кредитной карты:

if(DevLevel > 0) 
    enable_test_mode(); 

В ошибке код обработки:

if(DevLevel == 0) 
    send_error_to_log(); 
else 
    print_error(); 

Заключение

Основным преимуществом здесь является то, что код между версиями может оставаться 100% идентичный. Больше не «забывайте включить это или отключить это при перемещении кода в реальном времени».

Может ли это быть реализовано в ColdFusion?

+0

Да, это можно сделать в ColdFusion. На нашем dev-сервере все находится под подпапкой/Projects, поэтому наличие корня a/Projects скажет мне, есть ли я на dev или production. Я думаю, мой вопрос: что это лучший способ его определить. Должен ли я иметь xml-файл за пределами веб-корня, который устанавливает каждый из критериев, таких как ведение журнала, отладка, улавливание ошибок, форматирование. Или мне просто нужно иметь двоичные критерии dev и production. Могут быть случаи, когда я нахожусь в процессе производства, что хочу отключить ошибку. –

+0

И если я помещаю его в xml-файл, значит, я читаю xml-файл onRequestStart? Возможно нет. Если у меня есть переменные с областью приложения, такие как Application.ErrorTrapping, Application.Logging, Application.Debugging, Application.Reinit, то, если они уже установлены, мне не нужно перечитывать файл конфигурации onRequestStart. –

1

Можете ли вы просто включить отладку в CFAdmin в своем блоке Dev для вашего IP-адреса, а затем использовать IsDebugMode()?

+0

Блестящий! Но подождите: у меня уже есть отладка, и IsDebugMode() возвращает «НЕТ». –

+0

Вы уверены, что ваш IP разрешен, и у вас нет тега kevink

1

Сбросьте область # server #, и вы увидите некоторые ключи, которые могут помочь - например, режим лицензии ColdFusion.

+0

Возможно. Не знаете, в чем была бы логика. –

1

Решение, которое мы используем, - это установить IP текущего экземпляра и проверить его на наличие известных IP-адресов. Простой, легкий, работает.

+0

Это неплохая идея. –

1

Много хороших ответов здесь. Я хотел бы упомянуть использование cgi.server_name, которое может быть объединено с использованием настраиваемого DNS для указания среды разработки. Чтобы заставить localhost работать, для IIS в Windows настройте файл hosts, например, например. это:

C: \ Windows \ System32 \ Drivers \ Etc \ хостов - добавить запись: 127.0.0.1 myapp.dev.mydomain.com.au

Затем в IIS карте сервера для этого DNS.

Ваши systest и UAT серверы могут быть настроены должным образом в DNS вашего КОРП, таких как myapp.systest.mydomain.com.au - systest myapp.uat.mydomain.com.au - УАТ myapp.mydomain. com.au - производство

Тогда в моем Application.cfc у меня есть getEnvironment(), который вызывается при каждой загрузке для простоты использования:

// get the environment based on cgi variables - top of application.cfc 
this.stConfig = THIS.getEnvironment(); 

//... onApplicationStart 

if (!stConfig.validEnvironment) { 
    writeOutput("Environment #cgi.server_name# not recognised"); 
    return false; 
} 

// ... 
public struct function getEnvironment() { 
    stConfig=structnew(); 
    stConfig.validEnvironment = 1; 

    switch (cgi.server_name) { 
     // my dev environment 
     case "myapp.dev.mydomain.com.au": { 
      stConfig.env = "dev"; 
      // +++ 
     } 
     // my dev environment 
     case "myapp.systest.mydomain.com.au": { 
      stConfig.env = "systest"; 
      // +++ 
     } 
     // etc 
    } 
    return stConfig; 
} 

Я также скопирует stConfig в контексте запроса.

Теперь у меня есть много других вещей, и есть много способов реализовать хранилище сред, например. но в основном я нахожу сочетание DNS и cgi.server_name, особенно хорошо подходящих для управления средами.

Fwiw, я буду включать ini-файлы в application.cfc на основе имени среды, которое я использую для хранения конфигураций, специфичных для среды. Я считаю, что getProfileSections() очень полезен для этого, так как файлы конфигурации очень просты в работе. У меня есть один общий файл, который разделяется между всеми средами, а затем специфичными для среды для тех параметров, которые необходимо настроить для каждой среды.

Смежные вопросы