我有多个JSON文件与我的Python PyPI包打包在一起。这些 JSON 文件作为配置文件从源分发复制到用户主目录下的 .ec2mc/目录。顶级配置 JSON 文件 (aws_setup.json) 旨在由用户修改。
如何设置它,以便覆盖旧的配置版本,除非用户对配置进行了自己的修改?
我目前的设置是将版本(int)和保护(布尔)密钥添加到aws_setup.json,版本密钥用于在更新发行版时更新配置,而保护密钥用于防止配置被覆盖的用户。逻辑如下:
# The config's aws_setup.json must have the "Protect" and "Version" keys
if not all(key in config_aws_setup for key in ("Protect", "Version")):
cp_aws_setup_to_config(aws_setup_src_dir)
# If the "Protect" key has been set to True, prevent overwriting aws_setup
elif config_aws_setup["Protect"]:
pass
# Version can be set to 0 during development for constant refreshing
elif source_aws_setup["Version"] == 0:
cp_aws_setup_to_config(aws_setup_src_dir)
# Update if aws_setup_src has larger version number
elif source_aws_setup["Version"] > config_aws_setup["Version"]:
cp_aws_setup_to_config(aws_setup_src_dir)
cp_aws_setup_to_config 函数使用分配的版本覆盖配置:
def cp_aws_setup_to_config(aws_setup_src_dir):
if os.path.isdir(config.AWS_SETUP_DIR):
shutil.rmtree(config.AWS_SETUP_DIR)
shutil.copytree(aws_setup_src_dir, config.AWS_SETUP_DIR)
虽然它有效,但我觉得这个设置有点复杂,并希望建议一种更简单的方式来达到相同的效果。
发行版的模板配置和用户的配置可以与文件比较进行比较,因为它们同时存在于同一个系统上。 FileCMP的CMP文件是理想的选择,因为它可以比较类似目录结构中的文件。
def recursive_cmpfiles(src_dir, dest_dir):
"""wrapper for filecmp.cmpfiles, which recursively finds src_dir's files"""
prefix_len = len(src_dir.parts)
cmp_files = []
for path, _, files in os.walk(src_dir):
for f in files:
cmp_files.append(Path(*(Path(path) / f).parts[prefix_len:]))
return filecmp.cmpfiles(src_dir, dest_dir, cmp_files, shallow=False)
# If 'Modified' key is True, prevent overwriting config's aws_setup
if config_aws_setup['Modified'] is False:
diffs = os2.recursive_cmpfiles(aws_setup_dir_src, aws_setup_dir_dest)
# If source and dest aws_setup differ, overwrite dest aws_setup
# If dest aws_setup missing files, overwrite dest aws_setup
if diffs[1] or diffs[2]:
cp_aws_setup_to_config(aws_setup_dir_src)
这消除了对版本密钥的需求,尽管仍然使用"保护"(现在为"修改")密钥。