Let' s говорят, что у Вас есть типичное веб-приложение и с файлом configuration.whatever. У каждого разработчика, работающего над проектом, будет одна версия для их dev коробок, будет dev, напоминание и инсценировки. Как заключают Вас сделка с этим в исходном контроле? Не регистрируются в этом файле вообще, согласовывают его с различными именами, или что-то полагает в целом?
Какой I' у ve, сделанного в прошлом, должен быть файл конфигурации по умолчанию, в котором регистрируются, чтобы поставить контроль. Затем у каждого разработчика есть их собственное, отвергают файл конфигурации, который исключен из исходного контроля. Приложение сначала загружает дефолт, и затем если отвергнуть файл присутствует, грузы это и использует какие-либо параметры настройки от отвергания в предпочтении к файлу по умолчанию.
В целом, чем меньший отвергнуть файл, тем лучше, но это может всегда содержать больше параметров настройки для разработчика с очень нестандартной окружающей средой.
Конфигурация кодекс, и Вы должны версия это. Мы основываем наши конфигурационные файлы на именах пользователей; и в UNIX/Mac и в Windows Вы можете получить доступ к user' s имя пользователя, и, пока они уникальны для проекта, Вы в порядке. Вы можете даже отвергнуть это в окружающей среде, но Вы должны ** версия управлять всем.
Это также позволяет Вам исследовать others' конфигурации, которые могут помочь диагностировать, строят и проблемы платформы.
Моя команда разделяет версии файлов конфигурации для каждой окружающей среды (web.config.dev, web.config.test, web.config.prod). Наши сценарии развертывания копируют правильную версию, переименовывая его к web.config. Таким образом, мы имеем полный контроль вариантов на файлах конфигурации для каждой окружающей среды, может легко выполнить разность, и т.д.
В настоящее время у меня есть " template" файл конфигурации с добавленным расширением, например:
web.config.rename
Однако я вижу проблему с этим методом, если критические изменения изменились.
Решение, которое мы используем, состоит в том, чтобы иметь только единственный конфигурационный файл (web.config/app.config), но мы добавляем специальный раздел к файлу, который содержит параметры настройки для всей окружающей среды.
Есть МЕСТНЫЙ, DEV, обеспечение качества, ПРОИЗВОДСТВО разделы каждый содержащий ключи конфигурации, относящиеся к той окружающей среде в нашем файле (файлах) конфигурации.
То, что делает эту всю работу, является собранием, названным xxx. Окружающая среда , на который ссылаются во всех наших заявлениях (winforms и веб-формы), который говорит применение, на какую окружающую среду она воздействует.
xxx. Собрание окружающей среды читает единственную линию информации от machine.config данной машины, которая говорит ему, что это находится на DEV, обеспечении качества, и т.д. Этот вход присутствует на всех наших автоматизированных рабочих местах и серверах.
Надежда это помогает.
+1 на подходе шаблона.
Но так как у этого вопроса есть Мерзавец признака, распределенная альтернатива приходит на ум, в котором настройки сохранены на частном тестировании отделение:
A---B---C---D--- <- mainline (public)
\ \
B'------D'--- <- testing (private)
В этой схеме магистраль содержит дженерик, " template" конфигурация файл, требующий минимальной суммы регуляторов стать функциональным.
Теперь, разработчики/тестеры могут щипнуть файл конфигурации к своему heart' s содержание, и только передает эти изменения в местном масштабе на одном частное тестирование отделения (например, B' = B + настройки). Каждый раз магистраль достижения, они легко сливают его в тестирование, которое приводит к слияние передает, такие как D' (= D + слитая версия B' s настройки).
Эта схема действительно сияет когда " template" файл конфигурации обновлен: изменения с обеих сторон слиты и чрезвычайно вероятны результат в конфликты (или испытательные неудачи), если они несовместимы!
Я всегда держал все версии файлов конфигурации в исходном контроле в той же папке как web.config файл.
Например,
web.config
web.qa.config
web.staging.config
web.production.config
Я предпочитаю это соглашение обозначения (в противоположность web.config.production или production.web.config) потому что
Файл конфигурации по умолчанию должен быть настроен таким образом, что Вы можете запустить приложение в местном масштабе на Вашей собственной машине.
Самое главное эти файлы должны быть почти на 100% идентичными в каждом аспекте, даже форматируя. Вы shouldn' t используют счета в одной версии и места в другом для того, чтобы заказать. Вам необходимо управлять различным инструментом против файлов, чтобы видеть точно, что отличается между ними. Я предпочитаю использовать WinMerge для diffing файлы.
Когда Ваш процесс сборки создает наборы из двух предметов, должна быть задача, которая переписывает web.config с файлом конфигурации, подходящим для той окружающей среды. Если файлы застегнуты, то не соответствующие файлы должны быть удалены из этого, строят.
I' ve использовал шаблон прежде, т.е. web.dev.config, web.prod.config, и т.д., но теперь предпочтите ' отвергните file' техника. web.config файл содержит большинство параметров настройки, но внешний файл содержит определенные для окружающей среды ценности, такие как связи db. Хорошее объяснение на Пол Wilson' s блог.
Я думаю, что это уменьшает сумму до дублирования между файлами конфигурации, которые могут причинять боль, добавляя новые ценности / признаки.
@Grant правильный.
I' m в команде с близко к 100 другим разработчикам и нашим файлам конфигурации не зарегистрированы в исходном контроле. У нас есть версии файлов в хранилище, которые тянут с каждым выездом, но ими don' t изменение.
It' s разработанный вполне прилично для нас.
В течение долгого времени я сделал точно, что сделал bcwood. Я держу копии web.dev.config, web.test.config, web.prod.config, и т.д. под исходным контролем, и затем мой строить/развертывать систему переименовывает их автоматически, поскольку это развертывается к различной окружающей среде. Вы получаете определенное количество избыточности между файлами (особенно со всем материалом asp.net там), но обычно это работает действительно хорошо. Вы также должны удостовериться, что все в команде не забывают обновлять все файлы, когда они вносят изменение.
Между прочим, мне нравится держать " .config" в конце как расширение так, чтобы ассоциации файла не становились сломанными.
До местных версий разработчика файла конфигурации я всегда стараюсь изо всех сил поощрять людей использовать те же местные параметры настройки как можно больше так, чтобы не было никакой потребности иметь Вашу собственную версию. Это doesn' t всегда работают на всех, в этом случае люди обычно просто заменяют его в местном масштабе по мере необходимости и идут оттуда. It' s не слишком болезненный или что-либо.
Мы используем файл конфигурации шаблона, в котором регистрируются к контролю вариантов, и затем шаг в нашем автоматизированном строит, чтобы заменить определенные записи в файле шаблона с определенными для окружающей среды параметрами настройки. Определенные для окружающей среды параметры настройки сохранены в отдельном файле XML, который также находится под контролем вариантов.
We' ре используя MSBuild в нашем автоматизированном строит, таким образом, мы используем задачу XmlUpdate от [Задачи Сообщества MSBuild] (http://msbuildtasks.tigris.org/), чтобы обновить ценности.
Зарегистрированный, версия простой ванили app/web.config должна быть достаточно универсальной, чтобы работать над всеми машинами разработчика и быть усовершенствованной любых новых изменений урегулирования, и т.д. Если Вы требуете определенного набора параметров настройки для dev/test/production параметров настройки, регистрируетесь в отдельных файлах с теми параметрами настройки, как GateKiller заявил со своего рода соглашением обозначения, хотя я обычно иду с " сеть prod.config" чтобы не изменить расширение файла.
Я версия управляю им, но никогда не выдвигаю его к другим серверам. Если рабочий сервер требует изменения, я вношу то изменение непосредственно в файл конфигурации.
Это может не быть симпатично, но это работает просто великолепно.
Я don' t думают there' s единственное решение, которое работает на все случаи, поскольку оно может зависеть от чувствительности данных в файлах конфигурации или языка программирования you' использование ре и столько других факторов. Но я думаю it' s важный, чтобы держать файлы конфигурации для всей окружающей среды под исходным контролем, таким образом, Вы можете всегда знать, когда он был изменен и кем, и что еще более важно, быть в состоянии возвратить его, если вещи идут не так, как надо. И они будут.
Так here' s, как я делаю это. Это обычно для nodejs проектов, но я думаю, что это работает на другие структуры и языки также.
То, что я делаю, создают справочник 'конфигураций' в корне проекта, и в соответствии с тем справочником держат несколько файлов для всей окружающей среды (и несколько раз отдельные файлы для каждого developer' s окружающая среда также), которые все прослежены в исходном контроле. И есть фактический файл, который кодекс использует названный 'конфигурацией' в корне проекта. Это - единственный файл, который не прослежен. Таким образом, это похоже на это
root
|
|- config (not tracked)
|
|- configs/ (all tracked)
|- development
|- staging
|- live
|- James
Когда кто-то проверяет проект, он копирует файл конфигурации, который он хочет использовать в неотслеженном файле 'конфигурации', и он свободен отредактировать его, как он желает, но также ответственен, чтобы скопировать эти изменения, прежде чем он согласится на другие файлы окружающей среды по мере необходимости.
И на серверах, неотслеженный файл может просто быть копией (или ссылка) отслеженного файла, соответствующего той окружающей среде. В JS у Вас может просто быть 1 линия, чтобы потребовать того файла.
Этот поток может быть немного сложным сначала, но у него есть большие преимущества:
На нашем проекте нам сохранили конфигурацию в файлах с < hostname> префикс тогда наш строить системное напряжение в соответствующей конфигурации на основе тока system' s имя хоста. Это работает хорошо на нас в относительно малочисленной команде, позволяя нам применить изменения конфигурации другого people' s файлы, если/когда мы добавляем новый пункт конфигурации. Очевидно, это определенно doesn' t измеряют к общедоступным проектам с неограниченным числом разработчиков.
У нас есть две проблемы здесь.
Во-первых мы должны управлять конфигурационным файлом, который отправлен с программным обеспечением.
Это - все два, легкие для разработчика зарегистрироваться в нежелательном, чтобы измениться на основной файл конфигурации, если они используют тот же файл в devolvement окружающей среде.
С другой стороны, если у Вас есть отдельный конфигурационный файл, который включен инсталлятором, очень легко забыть добавлять новое урегулирование к нему или позволять комментариям в нем выйти из синхронизации с комментариями в devolvement формирование файла.
Тогда у нас есть проблема, что разработчики должны сохранить там копию конфигурационного файла актуальной, поскольку другие разработчики добавляют новые параметры настройки конфигурации. Однако некоторые параметры настройки как последовательности соединения с базой данных отличаются для каждого разработчика.
Есть 3-я проблема, которую не покрывает вопрос/ответы. Как Вы сливаетесь в изменениях, которые имеет клиент, делают к Вашему конфигурационному файлу, когда Вы устанавливаете новую версию своего программного обеспечения?
я должен все же видеть пользу решения это работает хорошо во всех случаях, однако я видел некоторых частичные решения (который может быть объединен в различном комбинации по мере необходимости), который уменьшает проблема много.
Во-первых сократите количество пунктов конфигурации, которые Вы имеете в своем главном конфигурационном файле.
Если у Вас нет потребности позволить Вашим клиентам изменить Ваши отображения, используйте Быстрый NHibernate (или иначе), чтобы переместить конфигурацию в кодекс.
Аналогично для depency установки инъекции.
Разделите конфигурационный файл, если это возможно, например, используйте отдельный файл, чтобы настроить то, что регистрирует Log4Net.
Не повторяйте пункты между большим количеством конфигурационных файлов, например, если у Вас есть 4 веб-приложения, которые все установлены на той же машине, имеют полный конфигурационный файл, на который указывает web.config файл в каждом применении.
(Используйте относительный путь по умолчанию, таким образом, редко должным быть изменить web.config файл),
Обработайте конфигурационный файл развития, чтобы получить судоходный конфигурационный файл.
У можения быть сделанным есть значения по умолчанию в комментариях Xml, которые тогда установлены в конфигурационном файле, когда строить сделано. Или наличие разделов, которые удалены как часть процесса создания инсталлятора.
Вместо того, чтобы просто иметь последовательности соединения с базой данных, имейте один на разработчиков.
Например, сначала ищите «database_ianr» (где ianr - мое имя пользователя или машинное название) в конфигурационном файле во время, которым управляют, если это не найдено, затем ищите «базу данных»
Имейте 2-й уровень " например, - оракул или-sqlserver" сделайте его более быстрым для разработчиков, чтобы добраться до обеих систем базы данных.
Это может, конечно, также быть сделано для любой другой стоимости конфигурации.
Тогда все ценности, которые заканчиваются в «_userName», могут быть полосатыми прежде, чем отправить конфигурационный файл.
Однако в конце, что является Вами, a “владелец конфигурационного файла” это берет ответственно управления конфигурационный файл (файлы) как выше или иначе. Он должен также сделать a разность на потребительской отделке конфигурационный файл перед каждым отгрузка.
Вы не можете устранить необходимость заботливого человека некоторые это за исключением проблемы.
Я столкнулся с той же самой проблемой, и я нашел решение для нее. Я сначала добавил все файлы к центральному хранилищу (также разработчика).
Таким образом, если разработчик приносит файлы из хранилища, конфигурация разработчика также там. Когда изменение сделало к этому файлу, Мерзавец не должен знать об этих изменениях. Тем путем изменения не могут продвинуться/согласиться хранилище, но остаться в местном масштабе.
Я решил это при помощи команды мерзавца: 'индекс обновления - принимает - неизменный'. Я сделал файл летучей мыши, который выполнен в предварительно том, чтобы строить из проектов, которые содержат файл, изменения которого должны быть, игнорируют Мерзавцем. Вот кодекс, я вставил файл летучей мыши:
IF NOT EXIST %2%\.git GOTO NOGIT
set fileName=%1
set fileName=%fileName:\=/%
for /f "useback tokens=*" %%a in ('%fileName%') do set fileName=%%~a
set "gitUpdate=git update-index --assume-unchanged"
set parameter= "%gitUpdate% %fileName%"
echo %parameter% as parameter for git
"C:\Program Files (x86)\Git\bin\sh.exe" --login -i -c %parameter%
echo Make FIleBehaveLikeUnchangedForGit Done.
GOTO END
:NOGIT
echo no git here.
echo %2%
:END
В моем предварительно строить я был бы позвонивший файлу летучей мыши, например:
call "$(ProjectDir)\..\..\MakeFileBehaveLikeUnchangedForGit.bat" "$(ProjectDir)Web.config.developer" "$(SolutionDir)"
Я нашел на ТАК файле летучей мыши, который копирует правильный файл конфигурации к web.config/app.config. Я также призываю этот файл летучей мыши предварительно строить. Кодекс для этого файла летучей мыши:
@echo off
echo Comparing two files: %1 with %2
if not exist %1 goto File1NotFound
if not exist %2 goto File2NotFound
fc %1 %2
if %ERRORLEVEL%==0 GOTO NoCopy
echo Files are not the same. Copying %1 over %2
copy %1 %2 /y & goto END
:NoCopy
echo Files are the same. Did nothing
goto END
:File1NotFound
echo %1 not found.
goto END
:File2NotFound
copy %1 %2 /y
goto END
:END
echo Done.
В моем предварительно строить я был бы позвонивший файлу летучей мыши, например:
call "$(ProjectDir)\..\..\copyifnewer.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config
Мы просто сохраняем производственный файл конфигурации зарегистрированным. It' s developer' s обязанность изменить файл, когда они вытаскивают его из источника, безопасного для организации или развития. Это сожгло нас в прошлом так я wouldn' t предлагают его.