假设您有一个典型的Web应用程序,并且有一个名为configuration.whatever的文件。每个开发人员都会在他们的开发环境中使用一个版本,将会有一个dev,prod和stage版本。您如何在源代码控制中处理这个问题?是完全不提交此文件,还是以不同名称提交,或者采取其他花哨的方法?
假设您有一个典型的Web应用程序,并且有一个名为configuration.whatever的文件。每个开发人员都会在他们的开发环境中使用一个版本,将会有一个dev,prod和stage版本。您如何在源代码控制中处理这个问题?是完全不提交此文件,还是以不同名称提交,或者采取其他花哨的方法?
我过去的做法是准备一个默认的配置文件,将其纳入源代码控制。然后,每个开发者都有自己的覆盖配置文件,不包括在源代码控制中。应用首先加载默认配置文件,然后如果存在覆盖文件,则加载该文件并使用其中的任何设置替代默认文件。
一般来说,覆盖文件越小越好,但它始终可以为具有非常非标准环境的开发者包含更多设置。
配置是代码,你应该对其进行版本控制。我们的配置文件以用户名为基础,在UNIX/Mac和Windows中,你可以访问用户的登录名,并且只要这些对于项目是唯一的,你就没问题了。你甚至可以在环境中覆盖此设置,但你应该对所有内容进行版本控制。
这也允许你检查其他人的配置,这有助于诊断构建和平台问题。
不要对那个文件进行版本控制,可以对模板或其他内容进行版本控制。
我的团队针对每个环境保留单独的配置文件版本(web.config.dev、web.config.test、web.config.prod)。我们的部署脚本会复制正确的版本并将其重命名为web.config。这样,我们可以完全控制每个环境的配置文件版本,并且可以轻松执行差异比较等操作。
目前我有一个名为“template”的配置文件,其中添加了一个扩展名,例如:
web.config.rename
+1 模板方法。
但是由于这个问题有Git标签,分布式替代方案就会浮现在脑海中,其中自定义内容被保留在私有测试分支上:
A---B---C---D--- <- mainline (public)
\ \
B'------D'--- <- testing (private)
web.config
web.qa.config
web.staging.config
web.production.config
我更喜欢这种命名约定(而不是web.config.production或production.web.config)因为
默认的配置文件应该被配置成这样,以便你可以在自己的机器上本地运行应用程序。
最重要的是,这些文件应该在每个方面都几乎完全相同,甚至格式也一样。你不应该在一个版本中使用制表符,在另一个版本中使用空格进行缩进。你应该能够运行一个diff工具来查看文件之间的区别。我更喜欢使用WinMerge来查看文件的不同之处。
当你的构建过程创建二进制文件时,应该有一个任务用适合该环境的配置文件覆盖web.config。如果这些文件被压缩,那么无关的文件应该从该构建中删除。
@Grant是正确的。
我在一个拥有近100名开发人员的团队中,我们的配置文件没有被提交到源代码控制。我们在仓库中有文件的版本,每次检出时都会提取,但它们不会更改。
这对我们来说效果很好。