对于一个客户,我必须交付他们在 QA 和生产中使用的构建。构建文件的校验和必须匹配——它在 QA 和生产之间根本不能改变。每个环境的配置都不同,所以我有一个只包含代码的构建,然后为每个环境单独构建一个只包含环境特定配置文件的构建。无论环境如何,构建的配置文件都会将文件放在相同的位置,因此代码始终可以加载 c:\myapp\myconfig.xml,其中将包含该环境的设置。我读过的大多数文章(例如Scott Hanselman 的) 涉及每个环境的不同构建,但这不起作用,因为校验和值会不同。我应该以其他方式部署这些配置文件,还是有可行的解决方案?我当前解决方案的一个问题是它需要多个几乎相同但不完全相同的配置文件。因此,必须将一项更改添加到多个文件中,这是我想避免的,但我不知道该怎么做,除非在构建时或使用复制正确文件的外部脚本。
2 回答
不确定您的设置是否更复杂,但我们有类似的问题,我们添加了一个自定义操作类,该类根据环境(用户在安装过程中选择)更新配置文件,然后将此自定义操作项目添加到您的设置中项目。这样,无论您要安装到什么环境,您都可以使用一个安装程序 exe。
如果您有兴趣,请告诉我,我可以发布一些示例或更多关于我们如何完成它的信息。
以下是更多细节:
- 向您的安装项目添加一个新对话框以向用户请求环境(我们使用 4 个单选按钮对话框与我们拥有的 4 个环境:dev、qa、staging 和 production)
- 配置 4 个单选按钮的值和该值将设置的属性,即“环境”(稍后由 CustomActions 类使用)
- 使用单个类 (CustomActions) 将 dll 项目添加到您的解决方案
在 CustomAction 类中,您将我们在第二步中配置的属性读取为:
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"];
现在您的 env 变量包含我们在步骤中分配给每个单选按钮的值。然后,您可以使用 switch 语句来决定用户选择的环境。并使用以下命令适当地更新您的配置文件:
配置配置 = ConfigurationManager.OpenExeConfiguration(this.servicePath); //例如,要更改您将使用的连接字符串: config.ConnectionStrings.ConnectionStrings["oracle"] = "dev conn string here";
回到您的设置项目,将 CustomActions 项目的输出添加到您的 CustomActions 编辑器(查看菜单 -> 编辑器 -> 自定义操作)
最后,配置安装项目的 CustomActionData 属性以将环境和其他变量传递给 CustomAction 类(我的看起来像这样:/serviceFolder="[TARGETDIR]\" /serviceExe="blahblah.exe" /serviceName="MyServiceName " /environment="[环境]"
希望这有意义并适用于您的解决方案!
假设:
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="yes" / >