工作中遇到这样的需求:
说有这么一个项目
发布成 Debug 模式的时候, 访问的是 测试服务器。
发布成 Release 模式的时候, 访问的是 正式服务器。
服务器的 域名 / 路径 / 端口 信息,是存储在 app.config 里面的。
一开始的时候,端口号是一样的。
对于 Debug 模式, 访问的是 http://局域网的测试服务器:8080
对于 Release 模式, 访问的是 http://www.不可说不可说.com:8080
为了避免 每次生成代码的时候, 都重复地 修改 app.config 。
配置文件里面,就写死了, 是 http://www.不可说不可说.com:8080
然后,在测试计算机上面,修改 C:\Windows\System32\drivers\etc\hosts 文件。
增加一行
局域网的测试服务器IP地址 www.不可说不可说.com
例如:
192.168.1.2 www.不可说不可说.com
运行了一段时间,一切还好。
-------------------- 分割线 --------------------
但是不久以后,新的需求来了。
需要有 远程测试的功能。
端口号要不一样了。
对于 Debug 模式, 访问的是 http://www.不可说不可说.com:9090
对于 Release 模式, 访问的是 http://www.不可说不可说.com:8080
一想到每次发布不同的版本,都要去修改 app.config. 就脑袋疼啊。
想到 Web 项目里面, 可以有 Web.config / Web.Debug.config / Web.Release.config 这种模式的。
App.config 可以有么?
网上查询了一下,好像是没有找到。
只有自己想想解决办法了。
查看了一下 项目里面, 有个 “生成事件” 的选项。 暂时想到一个解决办法。
勉强能避免每次发布时,根据 Debug / Release 手动 修改配置文件的情况。
-------------------- 分割线 --------------------
下面是一个简单的测试可行性的例子.
app.config 中只包含一个 字符串信息。
通过 “生成事件”, 动态地 替换掉 app.config
首先是那个 测试的属性.
图片1:
测试的代码.
图片2:
项目的结构:
图片3:
项目包含 app.config / app.Debug.config / app.Release.config
app.Debug.config 部分内容
<applicationSettings>
<A4001_DebugRelease.Properties.Settings>
<setting name="TestName" serializeAs="String">
<value>我现在运行在 Debug 模式下</value>
</setting>
</A4001_DebugRelease.Properties.Settings>
</applicationSettings>
app.Release.config 部分内容
<applicationSettings>
<A4001_DebugRelease.Properties.Settings>
<setting name="TestName" serializeAs="String">
<value>我现在运行在 Release 模式下</value>
</setting>
</A4001_DebugRelease.Properties.Settings>
</applicationSettings>
重要的在这里
图片4:
copy $(ProjectDir)app.Debug.config $(ProjectDir)bin\Debug\$(TargetName).exe.config
copy $(ProjectDir)app.Release.config $(ProjectDir)bin\Release\$(TargetName).exe.config
作用就是 当编译处理结束后,用 项目中的 app.Debug.config 替换掉 Debug 目录下的 config
用 项目中的 app.Release.config 替换掉 Release 目录下的 config
测试运行结果
图片5:
-------------------- 分割线 --------------------
这么折腾一下以后, 可以不用 在 Debug / Release 切换的时候, 修改 app.config 了。
缺点嘛,就是 SVN 服务器上面, 又要多两个文件了 ......
-------------------- 最后的分割线 --------------------
说话我把测试项目测试好, Debug / Release 都测试好了, 往服务器上传代码的时候,竟然失败了...
难道是代码写得不够好?
再仔细看看那2行
copy $(ProjectDir)app.Debug.config $(ProjectDir)bin\Debug\$(TargetName).exe.config
copy $(ProjectDir)app.Release.config $(ProjectDir)bin\Release\$(TargetName).exe.config
每次都要复制2个文件, 也不环保啦。
修改修改
最后修改成下面这个样子:
copy $(ProjectDir)app.$(ConfigurationName).config $(ProjectDir)bin\$(ConfigurationName)\$(TargetName).exe.config
恩,看上去顺眼多了...