Как развернуть различные значения App.config (с WiX)

Я искал рекомендации по лучшей практике для развертывания приложения с установщиком WiX для различных значений в его файле App.config. Например.

На моей локальной машине разработки я использую настройки App.config для нашей тестовой среды:

<configuration>
    <appSettings>
        <WorkingDirectory>C:\Working</WorkingDirectory>
    </appSettings>
    <connectionStrings>
        <add name="ApplicationEntities" 
             connectionString="[TestingConnectionString]" 
             providerName="System.Data.EntityClient" />
    </connectionStrings>
</configuration>

При развертывании в тестовой среде эти параметры являются приемлемыми. Однако при развертывании в производственной среде я бы хотел, чтобы они были другими. Например:

<configuration>
    <appSettings>
        <WorkingDirectory>\\prodserver\Working</WorkingDirectory>
    </appSettings>
    <connectionStrings>
        <add name="ApplicationEntities" 
             connectionString="[ProductionConnectionString]" 
             providerName="System.Data.EntityClient" />
    </connectionStrings>
</configuration>

Ответ на мой вопрос вполне может быть независимым от WiX. Но на всякий случай вот фрагмент моего файла WiX Product.wxs:

<Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
        <Component Id="ProductComponent" Guid="{MY-GUID}">    
            <File Id="Application.exe"
                  Name="Application.exe"
                  Source="..\Application.exe"
                  Vital="yes"
                  KeyPath="yes"
                  DiskId="1" />
            <File Id="Application.exe.config"
                  Name="Application.exe.config"
                  Source="..\Application.exe.config"
                  Vital="yes"
                  KeyPath="no"
                  DiskId="1" />
        </Component>
    </ComponentGroup>
</Fragment>

Эта настройка заканчивается ручным редактированием файла App.config на рабочем сервере, что приводит к ошибке вручную. Что было бы лучшим способом справиться с этим, чтобы приспособить автоматизированное развертывание?

1 ответ

Решение

Я могу придумать два варианта: либо развернуть файл app.config и отредактировать его с помощью элемента XmlFile, либо сохранить несколько файлов app.config, каждый из которых представляет целевую среду, а затем развернуть соответствующий файл.

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

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

<Component Id="development.app.config" Guid="*">

    <Condition>DEVELOPMENT</Condition>
    <File Name="development.app.config" KeyPath="yes">
        <CopyFile Id="development.app.config" DestinationName="app.config" />
    </File>

    <util:XmlFile
        Id="WorkingDirectory"
        Action="setValue"
        File="app.config"
        ElementPath="/configuration/appSettings"
        Name="WorkingDirectory"
        Value="C:\Working"
        Permanent="no" />

</Component>

<Component Id="production.app.config" Guid="*">

    <Condition>PRODUCTION</Condition>
    <File Name="production.app.config" KeyPath="yes">
        <CopyFile Id="production.app.config" DestinationName="app.config" />
    </File>

    <util:XmlFile
        Id="WorkingDirectory"
        Action="setValue"
        File="app.config"
        ElementPath="/configuration/appSettings"
        Name="WorkingDirectory"
        Value="\\prodserver\Working"
        Permanent="no" />

</Component>
Другие вопросы по тегам