Различные настройки *.csproj/*.config для каждого члена команды и ветки

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

Мы - команда из 10 разработчиков, некоторые разработчики предпочитают использовать полный экземпляр IIS, в то время как другие предпочитают использовать IIS-Express. Есть и достоинства в использовании, например, IIS наиболее близко напоминает производство, в то время как IIS-Express позволяет отлаживать Edit-and-Continue.

В дополнение к 10 разработчикам, мы используем систему управления версиями, и у нас есть ветвящаяся структура. Каждая ветка может иметь разные настройки web.config/app.config, такие как строки подключения к базе данных. Разработчик может работать с несколькими веткими один раз, поэтому у нас обычно есть одна база данных на каждую ветку, мы рассматриваем разработчиков, имеющих локальные базы данных, но столкновение имен все еще остается проблемой независимо от подхода (т.е. у разработчика может быть 2 локальные базы данных, по одному для каждой ветки).

Первая проблема - с файлами csproj, а именно с настройками веб-сервера. Если один разработчик проверяет файл csproj, который использует IIS-Express, а другой разработчик выполняет Get Latest, он перезаписывает их конфигурацию, тратит время и создает разочарование.

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

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

Очевидным решением для этого является то, что у всех одинаковые настройки всегда, но некоторые разработчики могут захотеть использовать экземпляр LocalDB, другие могут использовать SQL-Express, а промежуточный сервер использует полноэкранный экземпляр SQLServer. Опять же, это еще одна настройка, которая не имеет окончательного результата.

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

Ответ 1

В частности, для веб-сервера VS имеет флажок "Применить настройки сервера ко всем пользователям (хранить в файле проекта)" - если не отмечен, то этот параметр сохраняется в вашем локальном файле .csproj.user, поэтому каждый может иметь собственные настройки там.

Для строк подключения вы можете иметь файл "user.config" на каждом компьютере (не в исходном элементе управления), где разработчик может ввести строку подключения. Основной файл конфигурации может просто загрузить этот файл, чтобы получить строка подключения. Есть несколько способов сделать это, но я пробовал это:

App.config or Web.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings configSource="user.config"></connectionStrings>
</configuration>

user.config:
<connectionStrings>
  <add name="test" connectionString="Server=.;Database=...;"/>
</connectionStrings>

Если это было приложение Windows, вы должны установить свойство "Копировать в выходной каталог" в файле user.config, чтобы Visual Studio скопировала его в каталог bin.

Ответ 2

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

Наконец, мы нашли ответ на нашу аналогичную проблему, выбрав файлы .config в обозревателе решений и нажав (Visual Studio) FileSource ControlExclude selection from Source Control.

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

(Примечание: это работает в VS2010, я не могу гарантировать, что этот вариант существует в 2012 году)

Ответ 3

У меня была аналогичная проблема, когда у меня было 3 базы данных для 3-х веток для 3-х сред.

Сервер производства == > Производственная БД == > prod branch == > Строка подключения Prod Сервер тестирования == > Мастер-БД == > Мастер-ветвь == > основная строка подключения local Development == > локальная БД == > ветвь разработчика == > строка подключения разработчика...

Внутри папки .git есть git hooks, где вы можете помещать скрипты в выполнение всякий раз, когда вы проверяете ветку. У меня есть post-checkout script, который выполняется каждый раз при проверке и который обновляет строку подключения для меня, что избавляет меня от ручных изменений в файле web.config:

!/Bin/bash

. конфиг  eval $(git branch | grep "| sed" s///")

sed -es/{SERVER}/$server/g -es/{DATABASE}/$database/g -es/{USER}/$user/g -es/{PASS}/$pass/g -es/{SITE_TYPE}/$site_type/g\