Tôi đã viết một tập lệnh Python (bên dưới) để xuất một nhóm các mục cấu hình bằng cách sử dụng drush
. Nó có thể hữu ích trong trường hợp của bạn (nó đã có trong trường hợp của tôi). Sử dụng:
export_config_group.py -s something -m foobar
Điều này thực thi drush config-list
, lấy tất cả các mục có tên chứa thuật ngữ something
, sau đó lưu chúng vào modules/custom/foobar/config/install
.
Kịch bản cũng điều chỉnh yml như sau:
- loại bỏ các
default_config_hash
mục khi nó tồn tại;
- loại bỏ các
uuid
mục khi nó tồn tại.
Kịch bản phụ thuộc vào ruamel.yaml để tải và kết xuất cấu hình. Hãy chắc chắn rằng bạn pip install
trước.
import os
import argparse
import subprocess
import ruamel.yaml
MODULES_ROOT = "/var/www/html/dm/web/modules/custom"
def main():
search_term, module, keep_uuid = parse_arguments()
module_config_path = os.path.join(MODULES_ROOT, module, 'config/install')
items = run_process(['drush', 'config-list']).splitlines()
for item in items:
if search_term in item:
print "Config item:", item
yml = run_process(['drush', 'config-get', item])
new_yml = adjust_yml(yml, keep_uuid)
full_path = os.path.join(module_config_path, item + '.yml')
with open(full_path, 'w') as f:
f.write(new_yml)
def parse_arguments():
ap = argparse.ArgumentParser(description="Export config group.")
ap.add_argument("-s", "--search", required=True, help="Search term")
ap.add_argument("-m", "--module", required=True, help="Destination module")
ap.add_argument("-u", "--uuid", help="Keep UUID",
action='store_true', default=False)
args = ap.parse_args()
return args.search, args.module, args.uuid
def run_process(params):
process = subprocess.Popen(params, stdout=subprocess.PIPE)
stdout, _ = process.communicate()
return stdout
def adjust_yml(yml, keep_uuid):
loader = ruamel.yaml.RoundTripLoader
config = ruamel.yaml.load(yml, loader, preserve_quotes=True)
remove_core_config_hash(config)
if not keep_uuid:
remove_uuid(config)
dumper = Dumper = ruamel.yaml.RoundTripDumper
return ruamel.yaml.dump(config, Dumper=dumper, indent=2, block_seq_indent=2)
def remove_core_config_hash(config):
if '_core' in config:
if 'default_config_hash' in config['_core']:
config['_core'].pop('default_config_hash')
# Also remove '_core' node if empty
if not config['_core']:
config.pop('_core')
def remove_uuid(config):
if 'uuid' in config:
config.pop('uuid')
if __name__ == "__main__":
main()