【问题标题】:Git code management with environmental differences环境差异的 Git 代码管理
【发布时间】:2017-12-04 00:55:48
【问题描述】:

我开始质疑我是否在 master 和 dev 之间遵循我的 Git 策略的最佳实践,因为部署并不像看起来那么简单。

我有一个 master 和 dev 分支,它们有一些环境差异。在大多数存在配置差异的地方(即连接字符串、应用程序设置等),我已经能够将这些差异抽象到位于 Git 之外的环境配置文件中。从 master 切换到 dev 时,团队中的开发人员复制并粘贴到正确的环境配置中,一切正常。

但是,在某些地方,master 和 dev 之间的代码本身有所不同。最具体的示例是在 Ninject (DI) 配置文件中,它在使用生产电子邮件服务和开发电子邮件服务之间有所不同,因此客户永远不会意外收到电子邮件。

我们考虑过使用 #if DEBUG 预处理器,但这并不能防止开发人员在“发布”模式下运行 dev 分支。

当将 dev 合并到 master 时,跨分支的代码差异变得难以管理,因为每次我们发现自己手动确保 master 代码永远不会被覆盖。为了帮助解决这个问题,我们最终创建了一个“合并”分支,该分支已经设置了生产提交并忽略了冲突的开发提交。

问题变成使所有这些分支保持同步并以正确的顺序合并/发出拉取请求,以确保合并正确的代码。

如果可能,有人可以提出更好的“策略”来管理这些分支,以便部署就像将 dev 合并到 master 一样简单?

【问题讨论】:

  • 首先,这可能更适合programmersexchange,而不是stack。其次,您的代码在生产、测试​​和开发之间永远不应该有所不同(也就是说,当然,一旦它已经发布并且相同的版本在所有三个中运行 - 通常 prod 将是最旧的,test 是新的,而 dev 是最新的)。你有不同的产品服务的想法是可怕的。你如何测试它?你如何确保它是否仍然有效?对于大多数电子邮件服务(SMTP、AWS SES、sendgrid 等),您可以轻松地为不同的环境使用不同的信用集。
  • 您还应该在发送电子邮件的任何内容中编写一些代码,以避免将其发送给真实客户(如果您遇到真实客户数据存在于开发/测试中的情况)-> 为此,添加将 Environment 之类的内容添加到您的设置文件(无论可能是什么),并让您的 CI 在部署时对其进行更新。
  • config/settings文件也可以在.gitignore管理。
  • @zaitsman 我强烈反对您的第一条评论。使用开发特定的依赖注入服务不会损害测试能力。如果我们在生产中使用 sendgrid 但想将 mailtrap.io 用于开发目的,我看不出这有多“可怕”。至于你的第二条评论,我比较喜欢。您的建议是将环境保留在配置文件中并阅读它而不是使用调试标志。将其发布为答案?我会合并方法并根据环境变量切换 SMTP 服务,但两者之间的来源是相同的。
  • @MarinaLiu-MSFT - 是的,我们对所有 *.config 文件使用 .gitignore。

标签: c# git azure-devops


【解决方案1】:

对于配置文件,您需要维护几个值文件(value.mastervalue.branch1,...)和每个配置一个模板文件,以便自动生成实际的配置文件。
请参阅“Do not overwrite config file on Azure using GIT”:它使用内容过滤器驱动程序。

对于代码,如果可以,请在同一代码中维护不同的执行路径,以避免管理合并。

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 2011-02-27
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多