我的工作已经由多个开发人员多年来开发的产品。
该产品是建立在
该产品具有通过在服务器目录分离的不同模块。 这些模块都在我的个人到位桶库也是如此。
幸运的是,所有的模块使用同一个数据库。 在代码级别,配置诸如数据库名称,网址(以访问API,指向在服务器中的其他文件夹资产)是硬编码。
我们有4个实例(开发,生产,ABC,abcdev)。 硬编码的配置是为每个实例不同。 我已经实现的Git最近,并推动所有代码到服务器中。
范围是维护一个信息库,并有不同的情况不同的分支。 因为在这么多地方的值被硬编码,分支机构之间的合并将是非常困难
我觉得我应该来处理它的方式是,创建一个名为另一个模块config
,加上想必json
,将有网址的话,数据库相关的信息文件。
该文件显然是为每个分支不同,该文件也不会在树枝上被改变。 虽然这是所有在理论上,我怎么去实现它? 还是有什么其他更好的方法来处理这种情况? 对于任何反馈,我们都表示感谢! 谢谢!
首先,将你所有的配置选项到一个配置文件(或文件)。 使用语言无关的格式,如JSON或YAML。
把配置文件/目录的源代码树在那里很容易找到的顶部。
范围是维护一个信息库,并有不同的情况不同的分支。
一个单一的回购是好的。 不同的分支都没有。 管理许多长寿分公司迅速变得复杂。
相反,有一个长寿命的分支,可能master
。 使用功能分支隔离的发展和他们被允许合并成面前摆着QA'd master
。 这样, master
总是准备好了。 直接从部署master
。
下面是可能的样子。 每个字母是提交。 每个[branch]
是分支头。
I - J L - M - N [feature1]
/ \ /
A - B - C ----- F - G ----- K [master]
\ / \
D - E O - P [feature2]
这显示了两个完成的功能, D - E
与I - J
,已经通过了质量保证和被合并到master
。 由于QA已经在功能分支完成后, master
被部署到生产。 有两个开放的特性分支,其中的每一个定期运行git rebase master
使他们达到与最新的完全测试代码。
注意有没有直接提交给master
,它只能通过一个特性分支合并更改。 这意味着master
总是测试,可靠,并准备部署。 正在进行中的各个特征不相互干扰,并且可以依靠稳定的master
分支; 如果东西坏了,他们知道这是因为工作的关系,不能因为有人打破了Dev分支。
但对于不同的configs?
该文件显然是为每个分支不同,该文件也不会在树枝上被改变。
具有相同的配置文件在不同的分支不同的是一个伟大的方式来获得冲突和人们意外覆盖有测试和开发信息的配置。
这是简单的有一组以上的有各种不同的环境配置的配置文件,再加上他们的默认共享。
例如,你的数据库配置可能看起来像下面YAML 。
default: &default
adapter: postgresql
encoding: unicode
username: postgres
development:
<<: *default
database: myapp_development
host: localhost
test:
<<: *default
database: myapp_test
host: localhost
production: &production
<<: *default
host: our.production.server
username: production_db_user
client1:
<<: *production
database: client1
client2:
<<: *production
database: client2
它使用YAML锚和别名做叠加, <<: *default
说,包括标有节点&default
。 这消除了很多不同的上下文之间的冗余。
让你的应用程序从一个环境变量选择的环境,或者从上下文中猜出它。
这是Rails的是怎么做的 ,多个配置文件,每个文件为每个上下文配置部分。
下一步是制作秘密出的源代码,并把它们放进环境变量。 秘密之类的密码和API密钥。 然后,当你的生产系统开始,他们开始与设置这些环境变量。 这是云托管的网站,如Heroku的是怎么做的 。
另外,您可以在坚硬的配置文件进行编码制作的秘密,但加密。 然后,通过提供一个环境变量的解密密钥。 这意味着你只需要一个生产环境变量,如果你要迁移的旧系统,这可能是简单的。 这是TravisCI是怎么做的 。
这可能是一堆的工作,这取决于你的现有系统和工作流程的当前设置,但是这是一个非常成功的模式。
12个因子应用是建设现代化,维护和可扩展的应用的自以为是指导。
相关配置它告诉你要保持它的环境。 推荐的方法是使用环境变量。
十二因子应用商店中的环境变量配置(通常简称为ENV VARS或ENV)。 ENV VARS很容易在不改变任何代码展开时之间改变; 不同的配置文件,还有他们被检查到代码回购偶然的机会不大; 而不像自定义配置文件或其他配置机制,如Java的系统属性,它们是语言和操作系统无关的标准。
文章来源: How do I handle hard coded URL, database configuration in my product that has multiple modules in Git level?