如何部署不同的 App.config 值(使用 WiX)

Posted

技术标签:

【中文标题】如何部署不同的 App.config 值(使用 WiX)【英文标题】:How to deploy different App.config values (with WiX) 【发布时间】:2014-05-18 21:19:52 【问题描述】:

我一直在寻找关于如何使用 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 验证错误,通过复制之后的文件它可以避免这个错误。

还请注意,我有一个与组件关联的条件,您需要决定如何确定要部署到哪个环境。一些想法可能是使用机器名称、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>

【讨论】:

以上是关于如何部署不同的 App.config 值(使用 WiX)的主要内容,如果未能解决你的问题,请参考以下文章

C#项目 App.config 配置文件不同使用环境配置

Clickonce 应用部署,在 app.config 中隐藏密码

Azure Devops 中针对不同环境的 app.config 转换

如何使用 configurationManager 从 .Net 4.0 中的 App.config 读取值?

如何使用 PowerShell 读取/写入 App.config 设置?

如何在我的 .NET App.Config 文件中存储 XML 值