我有一个config.php
假设在不同分支中的内容不同,例如testing
和master
。
我在另一个问题(防止将来自 master 的文件与 Git 合并)问过如何防止该文件合并。
但我想知道,这是正确的方法吗?
我相信这是一个很常见的用例,在不同的环境中有不同的配置文件,并且您希望跟踪配置,对吗?
我有一个config.php
假设在不同分支中的内容不同,例如testing
和master
。
我在另一个问题(防止将来自 master 的文件与 Git 合并)问过如何防止该文件合并。
但我想知道,这是正确的方法吗?
我相信这是一个很常见的用例,在不同的环境中有不同的配置文件,并且您希望跟踪配置,对吗?
执行此操作的经典方法是拥有一个名为config.yml-dist的默认配置文件(假设您的原始文件名为config.yml);您将原始文件添加到 .gitignore 中,并且仅对dist进行版本化。
部署应用程序或重新克隆项目后,只需简单地cp config.yml-dist config.yml
更改所需的设置即可。
我在 PHP行业遇到的很多人都使用这种方法。
但是,有一个我更喜欢并且我觉得更干净:使用环境变量。例子:
username: <%= ENV['MONGOID_USERNAME'] %>
password: <%= ENV['MONGOID_PASSWORD'] %>
database: <%= ENV['MONGOID_DATABASE'] %>
这样,您将拥有一个版本化的配置文件,而不必编辑一个。
您可以让主分支不包含该文件,而只将它放在分支中——这是最简单的方法。
或者,假设主配置相当稳定,否则这将是一个很大的痛苦——config.php
在每个分支中提交更改,然后当您从中获取更改时始终使用 rebase 进行拉取,master
以便每次重新应用配置更改。
为什么不将所有特定于环境的配置文件存储在主存储库中?然后,无论是在构建还是部署过程中,您都可以使用任何相关的配置文件。有很多不同的实现方式,具体取决于您的构建/部署工具,但无论您采用哪种方式,我认为它都比在分支中更好。
我的观点是,您肯定希望将配置文件存储在版本控制中并使用部署工具进行部署,这样您就不会因为缺少更新或手动错误而让旧版本闲置。
通常存在一个文件夹结构,如
/configurations/test/properties/
/configurations/prod/properties/
并且部署工具根据要求在每个环境中使用它们。任何机密信息(例如密码)都可以被散列或加密:像 ansible vault 这样的技术直接支持这一点。