MSDeploy: обновить параметры в web.config во время деплоя

Автор: | 07/08/2016
 

Windows_logo_-_2012.svgВо время деплоя требуется изменить некоторые параметры для приложения в файле web.config.

Сделать это можно с помощью файла параметров и опции MSDeploy –setParamFile.

Проверяем наличие MSDeploy:

PS C:\> dir 'C:\Program Files (x86)\IIS\Microsoft Web Deploy V3'
...
-a---          3/9/2016  11:05 AM     216440 msdeploy.exe
-a---         4/24/2015   9:26 AM        227 msdeploy.exe.config

Создадим две директории — исходная, Src, из которой будут деплоиться данные, и Dst — которая будет играть роль удалённого сервера:

PS C:\> mkdir C:\WebDeployDemo\Src
...
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----          7/7/2016  10:32 AM            Src

PS C:\> mkdir C:\WebDeployDemo\Dst
...
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----          7/7/2016  10:32 AM            Dst

PS C:\> dir C:\WebDeployDemo
...
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----          7/7/2016  10:32 AM            Dst
d----          7/7/2016  10:32 AM            Src

Создадим web.config в каталоге Src с таким содержимым:

<configuration>
    <sites>
        <site description="SiteDescription" siteId="SiteId">
            <siteSettings BooleanSetting="False" StringSetting="someStringValue"/>
        </site>
    </sites>
    <customSection>
        <add value="SomeValue1" enabled="False"/>
        <add value="SomeValue2" enabled="True"/>
     </customSection>
</configuration>

В каталоге C:\WebDeployDemo создаём файл параметров — Params.xml с таким содержимым:

<parameters>
    <parameter name="changeBool" value="True">
        <parameterEntry type="XMLFile" scope="web.config$" match="//configuration/sites/site/siteSettings/@BooleanSetting"/>
    </parameter>
    <parameter name="changeString" value="NewAndChangedValue">
        <parameterEntry type="XMLFile" scope="web.config$" match="//configuration/sites/site/siteSettings/@StringSetting"/>
    </parameter>
    <parameter name="removeSection" value="">
        <parameterValidation kind="AllowEmpty" />
        <parameterEntry type="XMLFile" scope="web.config$" match="//configuration/customSection"/>
    </parameter>
</parameters>

С его помощью мы выполним следующее:

  1. изменим BooleanSetting на TRUE;
  2. изменим StringSetting на NewAndChangedValue;
  3. удалим customSection.

Установим перменную PATH:

C:\>set PATH=%PATH%;C:\Program Files (x86)\IIS\Microsoft Web Deploy V3

Проверяем MSDeploy:

C:\>msdeploy /?
Microsoft (R) Web Deployment Command Line Tool (MSDeploy.exe)
Version 7.1.1962.0
Copyright (c) Microsoft Corporation. All rights reserved.

MSDeploy.exe <-verb:<name>> <-source:<object>> [-dest:<object>] [args ...]
...

Запускаем:

c:\>msdeploy -verb:sync -source:dirpath=C:\WebDeployDemo\Src -dest:dirpath=C:\We
bDeployDemo\Dst -setParamFile=C:\WebDeployDemo\Params.xml
Info: Updating file (C:\WebDeployDemo\Dst\web.config).
Total changes: 1 (0 added, 0 deleted, 1 updated, 0 parameters changed, 232 bytes
 copied)

Проверяем:

c:\>type C:\WebDeployDemo\Dst\web.config
<configuration>
    <sites>
        <site description="SiteDescription" siteId="SiteId">
            <siteSettings BooleanSetting="True" StringSetting="NewAndChangedValue" />
        </site>
    </sites>

И более реальный пример.

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

Сдержимое web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration> 
 <connectionStrings>
    <remove name="conn1" />
        <add name="conn1" connectionString="server=server.database.windows.net;database=devdatabase1;userid=dbuser;password=dbpass;trusted_connection=False" providerName="System.Data.SqlClient" />
        <add name="conn2" connectionString="server=server.database.windows.net;database=devdatabase2;userid=dbuser;password=dbpass;trusted_connection=False" providerName="System.Data.SqlClient" />
        <add name="conn3" connectionString="server=server.database.windows.net;database=devdatabase3;userid=dbuser;password=dbpass;trusted_connection=False" providerName="System.Data.SqlClient" />
    <add name="StorageConnectionString" connectionString="DefaultEndpointsProtocol=http;AccountName=devstorage;AccountKey=devkey" />
  </connectionStrings>
</configuration>

Содержимое DEVProperty.xml:

<parameters>
    
    <parameter name="conn1" value="NewConnString">
        <parameterEntry type="XMLFile" scope="web.config$" match="//configuration/connectionStrings/add[@name='conn1']/@connectionString"/>
    </parameter>
        
</parameters>

С его помощью мы заменим значение connectionString в name="conn1" на значение «NewConnString«.

Запускаем:

$ msdeploy -verb:sync -source:dirpath=C:\BuildTest\Src -dest:dirpath=C:\BuildTest\Dst -setParamFile=C:\BuildTest\DEVProperty.xml
Info: Updating file (C:\BuildTest\Dst\web.config).
Total changes: 1 (0 added, 0 deleted, 1 updated, 0 parameters changed, 809 bytes copied)

Проверяем:

$ type Dst\web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <connectionStrings>
    <site Setting="ON" />
    <remove name="conn1" />
        <add name="conn1" connectionString="NewConnString" providerName="System.Data.SqlClient" />
        <add name="conn2" connectionString="server=server.database.windows.net;database=devdatabase2;userid=dbuser;password=dbpass;trusted_connection=False" providerName="System.Data.SqlClient" />
        <add name="conn3" connectionString="server=server.database.windows.net;database=devdatabase3;userid=dbuser;password=dbpass;trusted_connection=False" providerName="System.Data.SqlClient" />
    <add name="StorageConnectionString" connectionString="DefaultEndpointsProtocol=http;AccountName=devstorage;AccountKey=devkey" />
  </connectionStrings>
</configuration>

Ссылки по теме

Using MSDeploy to update and remove sections in web.config. A simple example