为每个环境使用单独的MSI构建配置文件

时间:2009-01-22 21:31:00

标签: c# .net deployment build-environment

对于一个客户,我必须提供他们在质量保证和生产中使用的构建。构建文件的校验和必须匹配 - 它在QA和生产之间根本不能改变。每个环境的配置都不同,所以我有一个只包含代码的构建,然后是每个环境的单独构建,它只包含特定于环境的配置文件。无论环境如何,配置文件构建都会将文件放在同一位置,因此代码始终可以加载c:\ myapp \ myconfig.xml,其中包含该环境的设置。我读到的大多数文章(例如Scott Hanselman's)涉及每个环境的不同构建,但这不起作用,因为校验和值会有所不同。我应该以其他方式部署这些配置文件,还是我有可行的解决方案?我当前解决方案的一个问题是它需要多个配置文件几乎相同但不完全相同。因此,必须将一个更改添加到多个文件中,这是我想要避免的,但我不知道如何在构建时或使用复制正确文件的外部脚本时执行此操作。

2 个答案:

答案 0 :(得分:1)

不确定您的设置是否更复杂,但是我们遇到了类似的问题,我们添加了一个自定义操作类,根据环境(用户在安装过程中选择)更新配置文件,然后添加此自定义操作项目到你的安装项目。这样,无论您要安装什么环境,都可以使用一个安装程序。

如果您有兴趣,请告诉我,我可以发布一些样品或更多信息,说明我们是如何完成的。

以下是一些更多细节:

  1. 向安装项目添加一个新对话框以向用户请求环境(我们使用4个单选按钮对话框,其中包含我们拥有的4个环境:dev,qa,staging和production)
  2. 配置4个单选按钮的值以及该值将设置的属性,即“环境”(后者由CustomActions类使用)
  3. 使用单个类(CustomActions)
  4. 将dll项目添加到您的解决方案中 在CustomAction类中,
  5. 将您在第二步中配置的属性读取为:

        if(!this.Context.Parameters.ContainsKey("environment"))
        {
            string error = "'environment' argument is null. Please configure config file manually";
            //...handle your error, etc.
            return;
        }
    
        string env = this.Context.Parameters["environment"];
    
  6. 现在你的env变量包含我们在步骤中为每个单选按钮分配的值。然后,您可以使用switch语句来确定用户选择的环境。并使用以下命令更新您的配置文件:

  7. 配置config = ConfigurationManager.OpenExeConfiguration(this.servicePath); //例如,要更改您使用的连接字符串: config.ConnectionStrings.ConnectionStrings [“oracle”] =“dev conn string here”;

    1. 返回安装项目,将CustomActions项目的输出添加到CustomActions编辑器(查看菜单 - >编辑器 - >自定义操作)

    2. 最后,配置安装项目的CustomActionData属性,将环境和其他变量传递给CustomAction类(我看起来像这样: / serviceFolder =“[TARGETDIR] \”/ serviceExe="blahblah.exe“/ serviceName =”MyServiceName“/ environment =”[ENVIRONMENT]“

    3. 希望这有意义并适用于您的解决方案!

答案 1 :(得分:0)

假设:

1)XML配置文件

2)构建之间的更改总数很少(即使复制到许多配置文件)

我会让安装程序在安装时更新配置文件

例如,我们使用WiX v3作为安装程序,并使用XmlFile元素在安装期间使用值更新多个配置文件

< util:XmlFile Action =“setValue”File =“[DIRECTORIES.WEBSERVICES] web.config”ElementPath =“// configuration / system.web / compilation”Name =“debug”Value =“false”Permanent = “是”/>