33

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

我们喜欢使用一组合理的默认值来检查这些配置文件,这样通过检查主干/主分支,您就可以在不需要四处寻找配置文件的情况下工作。

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

我们正在寻求切换到 Git,我正在尝试找出最佳方法。

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

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

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

选项 3:让开发人员保留本地分支,然后让他们始终将cherry-picks 或 rebase 分支签入主分支,以始终绕过/避免本地分支中不需要的提交:这在此处作为可能的工作流程提供,而我欣赏它在更改跟踪(所有签入)方面的简洁性,它在每次签入时都会引入大量所需的开销;这是一个很大的痛苦!

选项 4:已签入配置文件,但将它们标记为: 这是--assume-unchanged此处提供的一个可能选项;据我所知,它在本质上与ignore-on-commitTortoiseSVN 中的更改列表非常相似,只是在提交过程中您无法看到这些“隐藏”的更改文件;例如,TortoiseGit 确实显示带有“已更改”图标覆盖的文件,但在提交对话框中该文件根本不显示。这似乎有点吓人,又很容易忘记检查更改。

鉴于这些选项,这是我找到的所有选项,我真的希望有一种方法可以选择将本地配置文件“包含”到/覆盖签入的 app.config/web.config 文件并使用选项2 ; 有谁知道这样做的方法,或者我缺少的其他选项?(我有点想考虑一个自定义的 Xml 合并预构建步骤......)

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


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

更新 2:我已经删除了我之前的更新和答案,这很愚蠢/没有用。我没有意识到在“我们的”合并之后,另一个方向的下一次合并会将这些文件的“原始”版本带回(覆盖本地分支更改);如果您有兴趣,请参阅编辑历史。这个问题一如既往的开放。

4

5 回答 5

12

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

看看该网站并自己决定,但我绝对可以保证。

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

Edit2:还可以在这里查看 Daniel 的帖子:https ://stackoverflow.com/a/8082937/186184 。他给出了一个非常清晰的模板和电子表格示例,以及如何使其在您的解决方案中发挥作用。

于 2012-05-08T07:37:36.673 回答
7

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

内容过滤器驱动程序

这意味着,在每个git checkoutsmudge 脚本上,都会根据以下内容生成实际的配置文件:

  • 一个配置模板文件(带有配置值占位符,如@@A_PARAM_VALUE@@
  • 配置值文件之一(每个开发人员可以保留他/她自己的配置文件值的版本)

这避免了任何合并问题和 gitignore 设置:每个“配置值文件”都不同并且保持独立。
这也与pms1969答案中提到的ConfigGen等其他配置生成解决方案兼容。

于 2012-05-13T13:04:21.397 回答
1

我会看看这个答案,由Dan在部署环境之间管理复杂的 Web.Config 文件,以获得潜在的解决方案。我使用 mercurial 并使用相同的过程来签入一个通用的 web.config 文件,并使用 Web 转换来更改位置以指向我的部署特定的东西。configSource

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

在 web.config 中检查:

<?xml version="1.0"?>
<configuration>
  <!-- snip -->
  <connectionStrings configSource="config/connectionStrings.config" />
</configuration>

签入 web.debug.config:

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

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

于 2012-04-13T14:29:32.143 回答
0

我们公司也遇到了类似的困境。我们最终创建了单独的配置分支来补充主分支。例如 - 开发配置、主配置等。然后我们有一个小脚本,它将根据部署环境使用正确的源分支重新定位这些分支。因此,例如在开发机器上,我们会将develop-config 重新设置为develop。如果你在本地机器上工作,你会得到默认配置(所有开发人员都同意),它被检查到主分支中(如本地数据库名称、密码等)。当然,缺点是您必须始终保持这些 *-config 分支是最新的,或者在部署时让它们加速。

自从实施此工作流程以来,我遇到了几个部署工具,例如whiskey_disk,它们采用了一些类似的方法。事实上,我更喜欢他们的解决方案,因为它更加安全和灵活。虽然可能不适合你们,因为它更适合 LAMP/RoR 开发堆栈。

除此之外,还有一些商业解决方案,你可能想看看,比如Beanstalk

于 2012-05-10T05:16:53.507 回答
0

自 2012 年以来发生了一些变化,现在我建议您使用构建/部署工具(VS Team Services、TeamCity、Octopus Deploy)管理环境特定配置。

如果您在 azure 中工作,则可以将应用设置和连接字符串定义为应用定义的一部分。

于 2016-11-24T12:16:32.407 回答