0

我有Windows.Forms一个MSI使用Visual Studio Deployment Project.

Myapp.config有一些配置属性,其值必须替换为正确的值,具体取决于我要将客户端部署到的环境。

例如,我的客户端确实连接到 WCF 外观背后的一组 COM+ 服务,所以我URL在配置文件中有一些 s,这些 s 因环境(开发、集成等)而异。

通过这种方式,可以在应用程序配置行中找到这样的:

<add ServiceName="MyService" ServiceEndpoint="$(WS_URL)/MyService.svc" MaxMessageSize="xxxxxx"></add>

好吧,问题是我需要执行一个批处理文件(.bat)来加载一些变量,然后替换 中的变量app.config,但是,我需要在正在打包的应用程序配置文件中进行替换MSI,而不是执行替换客户端项目中的“原始”配置文件。

事实上,我需要的只是获取 VS 即将打包的应用程序配置文件的路径,并将文件路径传递给我的脚本,以便它进行替换。

注意:在上面的示例行中,$(WS_URL)是必须根据部署环境配置替换为正确值的变量。

4

2 回答 2

1

我会在源代码控制中创建您的 App.Config 的 2 个副本,并将一个与您的项目相关联以进行 F5 构建/开发调试,另一个由安装程序使用以供生产使用。

于 2012-08-31T13:28:07.667 回答
0

最后,我有了适合我们需求的解决方案。我的需要主要是为 Windows.Forms 客户端提供一个唯一的配置文件,并且能够在文件被打包到 MSI 之前替换其中的一些属性值。

我认为打包在 MSI 中的二进制文件是从项目输出目录中获取的,但它们不是,所以我不能使用该位置来执行我们的“变量替换器”脚本并App.config准备好最终文件被打包。

我们有一个.bat文件,每种环境配置一个,我们在其中集中了适用于 Windows.Forms、Web-Applications、COM+ Serviced Components 的配置属性,所以我很反感复制客户端的配置文件的想法,因为我的目标也是减少配置文件的数量,降低出错的风险,同时保持创建/维护构建环境的过程简单。

在打包 MSI 之前,我找不到任何文档来告诉我如何获取路径、临时文件夹或其他文件的位置。如果我可以访问它,那么我将执行指向该目录的“变量替换器”脚本并解决问题。

我的解决方法是放置一个自定义的预构建事件,以便我将“模板”复制App.config到项目目录,一旦它在那里,我运行脚本来替换属性值。

现在,每次构建部署项目时,我们都确信它包含一个有效的配置文件。

仅供参考,这是预构建事件的样子:

XCOPY /Y $(ProjectDir)config\*.* $(ProjectDir)
CALL ..\ScriptsCentral\do_apply_config.bat $(ProjectDir)App.config etc
EXIT 0

注意:我必须EXIT 0明确说明,因为我们使用 and 构建所有项目,msbuild并且devenv.com我在执行构建事件的部分停止了构建过程。

(感谢@ChristopherPainter 的时间和评论。+1 为您的建议)

于 2012-09-14T18:08:34.493 回答