Как развернуть различные значения 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>