Visual studio 2010 - для каждого разработчика / машины / среды Web.Config настройки - PullRequest
9 голосов
/ 10 мая 2011

Хотелось бы выбрать мозги этих показателей сборки MS Build / VS Post здесь.

Я бы хотел, чтобы мои записи web.config можно было настраивать для каждого пользователя / машины / среды.

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

для, например: web.config имеет запись $ connectionstring, а файлы настройки для пользователя / среды могут иметь потенциальные значения для замены $ connectionstring в зависимости от контекста / конфигурации, в которой построено решение

это означает, что у меня может быть набор файлов, как показано ниже:

user_joe.config

       $connectionstring = db_where_joe_like_to_connect_to 

staging.config

       $connectionstring = db_where_staging_connect_to  

production.config

       $connectionstring = db_production

, поэтому, если Джо компилирует решение из своего окна разработки, web.config должен иметь значение "db_where_joe_like_to_conn"ect_to "для $ connectionstring.

Я надеюсь, что может быть решение, не связанное с Nant.

надеюсь, что кто-то может бросать указатели.

Ответы [ 4 ]

7 голосов
/ 10 мая 2011

Вы можете использовать параметры преобразования web.config в Visual Studio 2010.

http://weblogs.asp.net/gunnarpeipman/archive/2009/06/16/visual-studio-2010-web-config-transforms.aspx

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

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

Добавить цель BeforeBuild Итак - из файла csproj:

<Target Name="BeforeBuild">
    <TransformXml Source="$(SolutionDir)Web.config" Transform="$(SolutionDir)Web.$(Configuration).config" Destination="$(SolutionDir)Web.$(Configuration).config.transformed" />
  </Target>
  <PropertyGroup>
    <PostBuildEvent>xcopy "$(SolutionDir)Web.$(Configuration).config.transformed" "$(SolutionDir)Web.config" /R /Y</PostBuildEvent>
  </PropertyGroup>


2 голосов
/ 29 февраля 2012

Я бы предложил использовать атрибут configSource в записях web.config для отладочных сборок.Затем в ваших тестовых и выпусковых сборках вы можете использовать преобразования данных для вставки записей тестирования и производства.

Вы бы сделали что-то вроде этого:myLocalConnectionStrings, которые вы не проверяете в системе контроля версий.В вашем Web.config.Release вы просто преобразуете раздел connectionStrings, чтобы включить производственные строки, и удалите атрибут configSource.

1 голос
/ 10 мая 2011

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

Кроме того, преобразования применяются ТОЛЬКО во время упаковки веб-сайта (вызывая целевой объект Package). Поэтому, если вы пытаетесь использовать это, чтобы у Джо и Салли могли быть разные конфиги на их собственной машине, это вам не подойдет.

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

0 голосов
/ 08 апреля 2016

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

Имя файла App.tt.

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".config" #>
<#
string pathToConfigurations = Host.ResolvePath("Configurations");
string pathToMachine = Path.Combine(pathToConfigurations, Environment.MachineName + ".config");
if (File.Exists(pathToMachine))
{
    Write(File.ReadAllText(pathToMachine)); 
}
else
{
    Write(File.ReadAllText(Path.Combine(pathToConfigurations, "App.config")));  
}
#>
...