Сделайте web.config динамическим

У нас есть приложение, и оно развертывается в разных конвейерах, предназначенных для разных выпусков.

Для бывшего конвейера A - предназначен для мартовского выпуска, конвейера B - для июньского выпуска и т. Д.

В каждом конвейере мы используем различные среды, такие как DEV, SIT и т. Д.

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

Например, у нас есть веб-сервер - ящик 1 для среды разработки. у нас есть Pipeline A и Pipeline B, развернутые как веб-сайты. Web.config конвейера A будет выглядеть так:

<configMap hostnameList="box1" name="DevEnvironment">
      <include set="Dev" />
</configMap>
<configSet name="Dev">
<add key="someUrl" value="http://somapp-piplelineA-Dev.app.com"/>
</configSet>

Web.config конвейера B будет выглядеть так:

<configMap hostnameList="box1" name="DevEnvironment">
      <include set="Dev" />
</configMap>
<configSet name="Dev">
<add key="someUrl" value="http://somapp-piplelineB-Dev.app.com"/>
</configSet>

Если вы видите эту конфигурацию, в значении ключа someurl pipeA был изменен на pipelineB. Эти изменения утомительны, когда ключей много. Итак, мы хотим создать единый файл web.config, который можно использовать во всех средах и который не потребует никаких изменений.


person RowLand    schedule 20.02.2015    source источник


Ответы (3)


С помощью Octopus Deploy вы можете развертывать свои веб-приложения в полуавтоматическом или полностью автоматическом режиме. Но также он может выполнять преобразование Web.config для каждой среды отдельно.

person abatishchev    schedule 20.02.2015

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

если вы создадите новый веб-проект asp .net, вы увидите образец внутри web.debug.config и web.release.config.

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

вы также можете использовать SlowCheetah. это очень удобное расширение.

person Hamid Pourjam    schedule 20.02.2015
comment
По умолчанию преобразование Web.config работает только в режиме конфигурации (отладка, выпуск и т. Д.) И плохо работает со средами (своего рода ортогональная концепция). Например, на Dev вы можете опубликовать Debug, а на Staging - Release. - person abatishchev; 20.02.2015

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

Что позволит вам иметь 1 конфиг, чтобы управлять ими всеми :)

https://xmlpreprocess.codeplex.com/

Описание проекта

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

Мое событие сборки

C:\XMLPreprocessor\XmlPreprocess.exe /i "C:\AppConfig\Core.config" /dbkind mssql /db "Server=localhost\SQLEXPRESS;Database=DB1;User Id=dbreader; Password=pass1;" /e $(ConfigurationName)

Это пример моего XML-файла конфигурации, параметры {} извлекаются из базы данных конфигурации SQL, которая содержит тип выпуска (1 = Отладка, 2 = Тест, 3 = Выпуск), и значения заполняются соответствующим образом.

<Nini>
     <Section Name="AppSettings">
      <!-- ifdef _xml_preprocess -->
      <!--
     <Key Name="RSAKeyStrength" Value="${RSAKeyStrength}"/>
        <Key Name="EventLog_Name" Value="{EventLog_Name}"/>
        <Key Name="DomainAddress" Value="${DomainAddress}"/>
        <Key Name="AuthIssuer" Value="${AuthIssuer}"/>
    -->
    <!-- else -->
    <Key Name="RSAKeyStrength" Value="2048"/>
        <Key Name="EventLog_Name" Value="MyApp"/>
        <Key Name="DomainAddress" Value="mydomain.com"/>
        <Key Name="AuthIssuer" Value="auth.domain.com"/>
    <!-- endif -->
  </Section>

  <Section Name="ConnectionStrings">
    <!-- ifdef _xml_preprocess -->
    <!--
    <Key Name="IdentityUserModelEntities" Value="data source=${DB1ConnectionString};MultipleActiveResultSets=True"/>
        <Key Name="DB1ModelEntities" Value="data source=${DB1ConnectionString};MultipleActiveResultSets=True"/>
        <Key Name="LoggingDB1Entities" Value="data source=${LoggingDB1ConnectionString};MultipleActiveResultSets=True"/>
    -->
    <!-- else -->
    <Key Name="IdentityUserModelEntities" Value="data source=localhost\SQLEXPRESS;initial catalog=DB1;user id=admin;password=pass1;MultipleActiveResultSets=True"/>
        <Key Name="DB1ModelEntities" Value="data source=localhost\SQLEXPRESS;initial catalog=DB1;user id=admin;password=pass1;MultipleActiveResultSets=True"/>
        <Key Name="LoggingDB1Entities" Value="data    source=localhost\SQLEXPRESS;Initial Catalog=LoggingDB1;user id=logging_admin;Password=pass1;MultipleActiveResultSets=True"/>
    <!-- endif -->
     </Section>
    </Nini>
person dynamiclynk    schedule 20.02.2015