我一直在寻找有关如何使用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手动编辑结束,这会引发手动错误。什么是更好的方法来处理这个以适应自动部署?
答案 0 :(得分:3)
我可以考虑两个选项,要么部署app.config文件并使用XmlFile元素进行编辑,要么维护多个代表目标环境的app.config文件,然后部署相应的文件。
这是两个选项的例子,请注意我复制文件而不是将其放在文件系统上。这有两个目的,首先您可以通过文件名查看已部署的文件,其次,如果将development.app.config和production.app.config放在同一位置,您将获得ICE30验证错误,之后复制文件可以避免此错误。
另请注意,我有一个与组件关联的条件,您需要决定如何识别要部署到的环境。一些想法可能是使用机器名称,OU或只是作为属性在命令行上传递它。
<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>