git中的web.config和app.config特定于机器的设置

Tao*_*Tao 32 .net git configuration app-config web-config

我们在不同的办公室有多个开发团队,他们需要在我们的项目web.configapp.config文件中进行大量配置设置的不同值.

我们希望使用一组合理的默认值来检查这些配置文件,这样通过检查trunk/master分支,您可以正常工作而无需挖掘配置文件.

从历史上看,我们已经使用了Subversion,特别是TortoiseSVN,这提供了一种管理本地更改的简便方法:我们只是将这些文件添加到TortoiseSVN的自动更改ignore-on-commit列表中.这可以防止意外签入这些文件,因为您需要专门选择它们以将其包含在签入中(并且您可以确保检查重大更改,而不是本地配置噪声).这种方法的主要缺点是配置文件总是看起来"已更改",因此无法一目了然地知道您是否有任何本地更改.

我们正在寻求转向Git,我正在努力找出最好的方法.

首先,其他StackOverflow答案中已有的内容:

选项1:检入xxx.sample文件和.gitignore实际配置文件:建议这样做,例如,在此答案中.我看到的主要问题是,在两个不同的点上很容易忘记对配置文件的更改:提交者很容易错过他们需要添加到.sample文件中的更改,而消费者(尤其是持续集成服务器)很容易错过他们需要将.sample文件中的更改合并到本地配置文件中.所以基本上,这似乎不是一个很好的解决方案.

选项2:拥有一个已签入的xxx.defaults文件和一个.gitignored xxx.local配置文件,该文件会覆盖它定义的任何设置:例如,这里提供了这个.问题是我们正在使用标准的.Net配置提供程序 - 当Mirosoft已经完成所有工作时,我真的不希望我们实现一个全新的设置加载框架.有没有人知道一种方法来获取app.config和web.config文件来引用可选的本地覆盖文件?

选项3:让开发人员保留本地分支机构,然后让他们总是检查樱桃选择或重新分支到主服务器,以便始终绕过/避免其本地分支中的不需要的提交:这是作为一个可能的工作流程在这里提供,而我在变更跟踪(所有签入的内容)方面欣赏它的清洁度,它在每次签入时都会引入大量所需的开销; 这是一个很大的痛苦!

方案4:有配置文件签入,但他们打上--assume-unchanged:这是献作为一个可能的选项,在这里 ; 据我所知,它与ignore-on-commitTortoiseSVN中的更改列表在精神上非常相似,除非您在提交过程中无法看到这些"隐藏"已更改的文件; 例如,TortoiseGit会显示带有"已更改"图标覆盖的文件,但在提交对话框中,文件根本不会显示.这看起来有点可怕,再次很容易忘记检查更改.

鉴于这些选项,我发现的所有选项,我真的希望有一种方法可以选择"包含"本地配置文件到/登录的app.config/web.config文件中,然后选择2 ; 有没有人知道这样做的方法,或者我缺少的其他选择?(我很想去考虑一个自定义的Xml合并预构建步骤......)

我之前应该提到,我们仍然在VS2008上,所以配置转换不可用.


更新:(删除,是完全错误的)

更新2:我删除了我以前的更新和答案,它是愚蠢的/不起作用.我没有意识到在"我们的"合并之后,另一个方向的下一次合并会带回这些文件的"原始"版本(覆盖本地分支的变化); 如果您有兴趣,请参阅编辑历史记录.这个问题和以往一样开放.

pms*_*969 12

我想建议你看看ConfigGen.我们在所有项目中都使用它,它为所有开发人员以及我们所有的环境创造了奇迹.它基本上运行一个表示机器名称和输出配置文件的电子表格,然后标记模板App.Config或Web.Config,将电子表格中的值替换为它.为项目添加一个简单的预构建步骤以运行configgen,在构建开始之前,您有一个为您的计算机定制的配置文件.它还支持默认设置.

看看网站并自己动手,但我绝对可以保证.

编辑:值得注意的是,您可以忽略所有Web.config和App.config文件(就.git而言).但您确实需要将模板和电子表格添加到仓库中.此外,我确信有一个更新的方式可能包括电子表格的xml替换,它有自己的编辑器,使其显然更适合DVCS.

编辑2:还可以看看Daniel的帖子:https://stackoverflow.com/a/8082937/186184.他给出了一个非常明确的模板和电子表格示例,以及如何使其在您的解决方案中运行.


Von*_*onC 7

您是否考虑过内容过滤器驱动程序

内容过滤器dfriver

这意味着,在每个上git checkout,涂抹脚本将基于以下内容生成实际的配置文件:

  • 配置模板文件(配置值占位符就像@@A_PARAM_VALUE@@)
  • 一个配置值文件(每个开发人员可以保持版本化他/她自己的配置文件值)

这避免了任何合并问题和gitignore设置:每个"配置值文件"都不同并保持独立.
这也是与其他配置代解决方案兼容一样ConfigGen中提到pms1969答案.


Jos*_*hua 1

我会看看Dan“在部署环境之间管理复杂的 Web.Config 文件”的答案,以寻找潜在的解决方案。我使用 Mercurial 并使用相同的过程来签入通用 web.config 文件,并使用 Web 转换来更改指向我的部署特定内容的位置。configSource

使用此路由的优点是它完全内置于框架中,不需要额外的代码,并且适用于 Web 部署。

在 web.config 中检查:

<?xml version="1.0"?>
<configuration>
  <!-- snip -->
  <connectionStrings configSource="config/connectionStrings.config" />
</configuration>
Run Code Online (Sandbox Code Playgroud)

在 web.debug.config 中检查:

<?xml version="1.0"?>
<configuration>
  <connectionStrings
      configSource="config/dev.connectionStrings.config"
      xdt:Transform="Replace(configSource)" />
</configuration>
Run Code Online (Sandbox Code Playgroud)

我已使用config/connectionStrings.config默认值签入,但开发服务器config/dev.connectionStrings.config未签入,并且在新部署中未替换。

  • 仅当您在本地发布或作为调试发布到开发服务器时,这才有效,而当您在 VS 中运行时则无效。 (3认同)