Как вы справляетесь с файлами конфигурации в системе управления версиями?

StackOverflow https://stackoverflow.com/questions/6009

  •  08-06-2019
  •  | 
  •  

Вопрос

Допустим, у вас есть типичное веб-приложение с файловой конфигурацией.неважно.У каждого разработчика, работающего над проектом, будет одна версия для своих dev-боксов, будут dev-, prod- и stage-версии.Как вы справляетесь с этим в системе управления версиями?Вообще не проверять этот файл, проверять его под другими именами или вообще делать что-то необычное?

Это было полезно?

Решение

То, что я делал в прошлом, - это иметь конфигурационный файл по умолчанию, который проверяется в системе управления версиями.Затем у каждого разработчика есть свой собственный конфигурационный файл переопределения, который исключается из системы управления версиями.Приложение сначала загружает значение по умолчанию, а затем, если присутствует файл переопределения, загружает его и использует любые настройки из переопределения в качестве предпочтения файлу по умолчанию.

Как правило, чем меньше файл переопределения, тем лучше, но он всегда может содержать больше настроек для разработчика с очень нестандартной средой.

Другие советы

Не создавайте версию этого файла.Версия шаблона или что-то в этом роде.

Конфигурация является код, и вы должны сделать его версию.Мы основываем наши конфигурационные файлы на именах пользователей;как в UNIX / Mac, так и в Windows вы можете получить доступ к логину пользователя, и пока они уникальны для проекта, все в порядке.Вы даже можете переопределить это в среде, но вы следует все зависит от версии.

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

Моя команда хранит отдельные версии конфигурационных файлов для каждой среды (web.config.dev, web.config.test, web.config.prod).Наши сценарии развертывания копируют правильную версию, переименовывая ее в web.config.Таким образом, у нас есть полный контроль версий конфигурационных файлов для каждой среды, мы можем легко выполнять различие и т.д.

В настоящее время у меня есть конфигурационный файл "template" с добавленным расширением, например:

web.config.rename

Однако я могу видеть проблему с этим методом, если были внесены критические изменения.

Решение, которое мы используем, заключается в том, чтобы иметь только один файл конфигурации (web.config/ app.config), но мы добавляем в файл специальный раздел, содержащий настройки для всех сред.

Существует ЛОКАЛЬНОЕ, РАЗРАБОТКА, КОНТРОЛЬ КАЧЕСТВА, ПРОИЗВОДСТВО разделы, каждый из которых содержит ключи конфигурации, относящиеся к этой среде, в нашем конфигурационном файле (файлах).

То, что заставляет все это работать, - это сборка с именем ххх.Окружающая среда на который ссылаются все наши приложения (winforms и webforms), которые сообщают приложению, в какой среде оно работает.

Сборка xxx.Environment считывает единственную строку информации из machine.конфигурация данной машины, которая сообщает ей, что она находится на стадии разработки, контроля качества и т.д.Эта запись присутствует на всех наших рабочих станциях и серверах.

Надеюсь, это поможет.

+1 к шаблонному подходу.

Но поскольку этот вопрос имеет тег в Git-распределенная альтернатива на ум приходит, в которых настройки хранятся на закрытое тестирование отрасль:

A---B---C---D---           <- mainline (public)
     \       \
      B'------D'---        <- testing (private)

В этой схеме основная строка содержит общий конфигурационный файл "шаблона" , требующий минимального количества настроек для обеспечения функциональности.

Теперь разработчики / тестировщики могут изменять конфигурационный файл по своему усмотрению и фиксировать эти изменения только локально в одной частной ветке тестирования (напримерB' = B + настройки).Каждый раз, когда mainline продвигается вперед, они без особых усилий объединяют его с тестированием, что приводит к коммит-кодам слияния, таким как D' (= D + объединенная версия настроек B).

Эта схема действительно работает, когда обновляется конфигурационный файл "шаблона":изменения с обеих сторон объединяются и с высокой вероятностью приведут к конфликтам (или сбоям тестирования), если они несовместимы!

Я уже использовал этот шаблон раньше, т.е.web.dev.config, web.prod.config и т.д., Но теперь предпочитаю метод "переопределения файла".Файл web.config содержит большинство настроек, но внешний файл содержит значения, зависящие от среды, такие как подключения к базе данных.Хорошее объяснение по Блог Пола Уилсона.

Я думаю, что это уменьшает количество дублирований между конфигурационными файлами, которые могут вызвать проблемы при добавлении новых значений / атрибутов.

Я всегда хранил все версии конфигурационных файлов в системе управления версиями, в той же папке, что и файл web.config.

Например

web.config
web.qa.config
web.staging.config
web.production.config

Я предпочитаю это соглашение об именовании (в отличие от web.config.production или production.web.config), потому что

  • Он сохраняет файлы вместе, когда вы сортируете их по имени файла
  • Он сохраняет файлы вместе, когда вы сортируете их по расширению
  • Если файл случайно попадет в рабочую среду, вы не сможете просмотреть содержимое по протоколу http, поскольку IIS предотвратит отправку файлов * .config

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

Самое главное, что эти файлы должны быть почти на 100% идентичны во всех аспектах, даже форматировании.Вы не должны использовать табуляции в одной версии и пробелы в другой для отступов.Вы должны иметь возможность запустить инструмент diff для файлов, чтобы точно увидеть, в чем разница между ними.Я предпочитаю использовать WinMerge для разделения файлов.

Когда ваш процесс сборки создает двоичные файлы, должна быть задача, которая перезаписывает web.config файлом конфигурации, подходящим для этой среды.Если файлы заархивированы, то не относящиеся к делу файлы должны быть удалены из этой сборки.

@Грант прав.

Я работаю в команде с почти 100 другими разработчиками, и наши конфигурационные файлы не проверяются в системе управления версиями.У нас есть версии файлов в репозитории, которые извлекаются при каждой проверке, но они не меняются.

У нас все получилось довольно хорошо.

Я контролирую его версии, но никогда не отправляю на другие серверы.Если производственный сервер требует внесения изменений, я вношу это изменение непосредственно в конфигурационный файл.

Может, это и некрасиво, но работает просто отлично.

Зарегистрированная простая версия app / web.config должна быть достаточно универсальной, чтобы работать на всех компьютерах разработчиков, и обновляться с учетом любых новых изменений настроек и т.д.Если вам требуется определенный набор настроек для настроек разработки / тестирования / производства, проверьте отдельные файлы с этими настройками, как указано в GateKiller, с каким-то соглашением об именовании, хотя я обычно использую "web.prod.config", чтобы не изменять расширение файла.

Мы используем конфигурационный файл шаблона, который проверяется в системе управления версиями, а затем на шаге нашей автоматической сборки заменяем определенные записи в файле шаблона настройками, зависящими от среды.Параметры, зависящие от среды, хранятся в отдельном XML-файле, который также находится под контролем версий.

Мы используем MSBuild в нашей автоматической сборке, поэтому мы используем задачу XmlUpdate из Задачи сообщества MSBuild чтобы обновить значения.

В течение долгого времени я делал именно то, что делал bcwood.Я храню копии web.dev.config, web.test.config, web.prod.config и т.д.под управлением версиями, а затем моя система сборки / развертывания автоматически переименовывает их по мере развертывания в различных средах.Вы получаете определенное количество избыточности между файлами (особенно со всем содержимым asp.net), но в целом это работает действительно хорошо.Вы также должны убедиться, что все члены команды не забывают обновлять ВСЕ файлы, когда в них вносятся изменения.

Кстати, мне нравится сохранять ".config" в конце в качестве расширения, чтобы ассоциации файлов не нарушались.

Что касается версий конфигурационного файла для локальных разработчиков, я всегда стараюсь изо всех сил поощрять людей максимально использовать одни и те же локальные настройки, чтобы не было необходимости иметь свою собственную версию.Это не всегда работает для всех, и в этом случае люди обычно просто заменяют его локально по мере необходимости и уходят оттуда.Это не слишком больно или что-то в этом роде.

В нашем проекте у нас есть конфигурация, хранящаяся в файлах с префиксом, затем наша система сборки извлекает соответствующую конфигурацию на основе имени хоста текущей системы.Это хорошо работает для нас в относительно небольшой команде, позволяя нам применять изменения конфигурации к файлам других людей, если / когда мы добавим новый элемент конфигурации.Очевидно, что это определенно не масштабируется для проектов с открытым исходным кодом с неограниченным числом разработчиков.

Здесь у нас есть две проблемы.

  • Во-первых, мы должны управлять файлом конфигурации, который поставляется вместе с программным обеспечением.

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

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

  • Тогда у нас возникает проблема, заключающаяся в том, что разработчикам приходится поддерживать копию файла конфигурации в актуальном состоянии, поскольку другие разработчики добавляют новые параметры конфигурации.Однако некоторые настройки, такие как строки подключения к базе данных, различны для каждого разработчика.

  • Существует третья проблема, которую вопрос / ответы не охватывают. Как вы объединяете изменения, внесенные клиентом в ваш конфигурационный файл, когда вы устанавливаете новую версию вашего программного обеспечения?

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

  • Во-первых, уменьшите количество элементов конфигурации, имеющихся в вашем основном файле конфигурации.

    Если у вас нет необходимости разрешать своим клиентам изменять ваши сопоставления, используйте Fluent NHibernate (или что-то другое), чтобы перенести конфигурацию в код.

    Аналогично для настройки впрыска с пониженным давлением.

  • Разделите файл конфигурации, когда это возможно, напримериспользуйте отдельный файл для настройки того, что регистрирует Log4Net.

  • Не повторяйте элементы между большим количеством файлов конфигурации, напримересли у вас есть 4 веб-приложения, которые установлены на одном компьютере, имейте общий файл конфигурации, на который указывает файл web.config в каждом приложении.

    (По умолчанию используется относительный путь, поэтому редко приходится изменять файл web.config)

  • Обработайте файл конфигурации разработки, чтобы получить файл конфигурации доставки.

    Это можно было бы сделать, указав значения по умолчанию в Xml-комментариях, которые затем устанавливаются в файле конфигурации при выполнении сборки.Или имеющие разделы, которые удаляются в процессе создания программы установки.

  • Вместо того чтобы иметь только одну строку подключения к базе данных, имейте по одной на каждого разработчика.

    Например, сначала найдите "database_ianr” (где ianr - это мое имя пользователя или имя компьютера) в файле конфигурации во время выполнения, если оно не найдено, затем найдите “база данных”

    Иметь 2 - й уровень ", например-oracle или -sqlserver" ускоряют доступ разработчиков к обеим системам баз данных.

    Конечно, это также может быть сделано для любого другого значения конфигурации.

    Затем все значения, которые заканчиваются на “_userName”, могут быть вычеркнуты перед отправкой файла конфигурации.

Однако, в конечном итоге, вы являетесь “владельцем файла конфигурации”, который берет на себя ответственность за управление файлами конфигурации, как указано выше, или иным образом.Он / она также должен выполнять изменение настроек клиента конфигурационного файла перед каждой отправкой.

Вы не можете избавиться от потребности в заботливом человеке из-за такой незначительной проблемы.

Я не думаю, что существует единое решение, которое работает для всех случаев, поскольку это может зависеть от чувствительности данных в файлах конфигурации или языка программирования, который вы используете, и многих других факторов.Но я думаю, что важно сохранять конфигурационные файлы для всех сред под контролем исходных текстов, чтобы вы всегда могли знать, когда они были изменены и кем, и, что более важно, иметь возможность восстановить их, если что-то пойдет не так.И они это сделают.

Итак, вот как я это делаю.Обычно это для проектов nodejs, но я думаю, что это работает и для других фреймворков и языков.

То, что я делаю, это создаю configs каталог в корневом каталоге проекта, и в этом каталоге хранятся несколько файлов для всех сред (а иногда и отдельные файлы для среды каждого разработчика), которые все отслеживаются в системе управления версиями.И есть фактический файл, который использует код, с именем config в корне проекта.Это единственный файл, который не отслеживается.Итак, это выглядит примерно так

root
|
|- config (not tracked)
|
|- configs/ (all tracked)
    |- development
    |- staging
    |- live
    |- James

Когда кто-то проверяет проект, он копирует конфигурационный файл, который он хочет использовать в неотслеживаемом config файл, и он волен редактировать его по своему усмотрению, но также несет ответственность за копирование этих изменений до того, как он внесет их в другие файлы среды по мере необходимости.

А на серверах неотслеживаемый файл может быть просто копией (или ссылкой) отслеживаемого файла, соответствующего этой среде.В JS у вас может быть просто 1 строка для запроса этого файла.

Поначалу этот процесс может быть немного сложным, но у него есть большие преимущества:1.Вам никогда не придется беспокоиться о том, что конфигурационный файл будет удален или изменен на сервере без резервной копии 2.То же самое, если у разработчика есть какая-то пользовательская конфигурация на его компьютере и его машина перестает работать по какой-либо причине 3.Перед любым развертыванием вы можете изменить конфигурационные файлы для development и staging например, и посмотреть, нет ли чего-нибудь недостающего или сломанного.

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

Я столкнулся с такой же проблемой и нашел для нее решение.Сначала я добавил все файлы в центральный репозиторий (также файлы разработчика).

Таким образом, если разработчик извлекает файлы из репозитория, конфигурация разработчика также находится там.При внесении изменений в этот файл Git не должен знать об этих изменениях.Таким образом, изменения не могут быть отправлены / зафиксированы в репозиторий, но остаются локальными.

Я решил это с помощью команды git: update-index --assume-unchanged.Я создал bat-файл, который выполняется в предварительной сборке проектов, содержащих файл, изменения которого Git должен игнорировать.Вот код, который я поместил в файл bat:

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

В моей предварительной сборке я бы вызвал файл bat, например:

call "$(ProjectDir)\..\..\MakeFileBehaveLikeUnchangedForGit.bat" "$(ProjectDir)Web.config.developer" "$(SolutionDir)"

Я нашел в SO файл bat, который копирует правильный конфигурационный файл в web.config/ app.config.Я также вызываю этот bat-файл в предварительной сборке.Код для этого bat-файла следующий:

@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.

В моей предварительной сборке я бы вызвал файл bat, например:

call "$(ProjectDir)\..\..\copyifnewer.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top