我有一个带有模块名配置的python项目A,其中包含一个config.yaml文件。 此项目用作其他人根据需要使用和更新config.yaml的模板。 我希望这些用户分叉我的git项目并在他们的fork上进行更新,并且能够在一个可用时获得模板的更新。 但是,我不想覆盖配置文件,因为他们将更改从主项目拉到他们的分支。 怎么解决这个问题?
My_app
MyConfigModule
__init__.py
config_helper.py
config.yaml
myAppModule
__init__.py
myModule.py
答案 0 :(得分:0)
首先,单独的代码和配置。整个代码应该驻留在My_app
中,用户不会触及,但只有开发人员才会触及,而配置可以位于根目录中。
您可以通过多种方式分离默认配置和实际配置:
拥有默认配置并允许用户设置其本地配置。用户必须自己创建config.yaml
文件。例如,bash(和许多其他程序)从/etc/bash.bashrc
读取其配置,然后从~/.bashrc
更新。这种方法的缺点是您需要实现配置合并机制。如果配置的某些部分是相当静态/复杂的(例如,程序设置或转换规则),这是一个好主意,但另一部分通常需要被覆盖(用户名/电子邮件地址)。
要求用户将config.default.yaml
复制到config.yaml
。在程序安装或运行时,如果config.yaml不存在,您可以抛出错误,解释如何复制,静默回退到默认配置,或将默认配置复制到config.yaml
,然后继续。您可以将大量文档放入默认配置中,但缺点是配置文件很长。例如,php's default configuration长度为2000行。
提示用户输入最重要(或所有)配置选项并编写一个小配置文件,如debian的debconf。如果您的程序具有交互式UI,这是一个好主意。
您可以混合这些选项,例如提示用户选择最重要的选项并依赖默认配置,或者在提示用户后稍作修改即可复制长默认配置。
在所有这些情况下,您希望在gitignore中包含config.yaml
而不是选中。如果您希望用户,则应将默认配置文件放在存储库的顶层手动复制。