Cookiecutter条件式提示与变量捕获问题求助
问题分析
你遇到两个核心问题:
- 条件子提示(AWS Dev账号ID)在所有主配置提示完成后才触发,不符合即时交互的预期
- 钩子中捕获的变量无法同步到Cookiecutter上下文,导致模板渲染报错
解决方案
1. 实现即时条件提示
Cookiecutter的pre_gen_project.py是在所有主配置提示完成后才执行的,所以无法实现选完"DEV环境"后立即弹出子提示。要实现动态条件提示,需要使用hooks/prompt.py钩子(要求Cookiecutter版本 ≥1.7.0),这个钩子会在主提示流程中运行,可以插入自定义的条件交互。
2. 正确同步捕获的变量到Cookiecutter上下文
在Python钩子中不能使用模板语法{{ ... }}操作cookiecutter对象,要直接通过Python字典的方式修改cookiecutter变量,确保变量名和模板中引用的一致。
修改后的具体代码
1. 更新cookiecutter.json
移除原有的aws_dev_account_id模板引用,只保留基础配置:
{ "project_name": "Short project name or application code", "project_slug": "{{ cookiecutter.project_name.lower().replace(' ', '-') }}", "dev_account": ["yes", "no"], "tst_account": ["no", "yes"], "prd_account": ["no", "yes"], "__prompts__": { "project_name": "Select your project name:", "project_slug": "Select your project slug:", "dev_account": "[3/5] Setting up DEV environment?", "tst_account": "Setting up TST environment?", "prd_account": "Setting up PRD environment?" } }
2. 创建/替换hooks/prompt.py
替换原有的pre_gen_project.py,用prompt.py实现条件提示:
import sys from cookiecutter.main import read_user_variable def main(): # 获取已选择的DEV环境配置 dev_selected = cookiecutter.get('dev_account') if dev_selected == "yes": # 即时弹出子提示 aws_dev_account_id = read_user_variable( "\tDEV Account Id", "What is your AWS Dev account's id?" ) # 将捕获的值直接写入cookiecutter上下文 cookiecutter['_aws_dev_account_id'] = aws_dev_account_id.strip() if __name__ == "__main__": main()
3. 在模板中引用变量
如果需要在模板文件中使用该变量,直接用{{ cookiecutter._aws_dev_account_id }}即可,示例:
dev_account_id: {{ cookiecutter._aws_dev_account_id }}
关键点说明
prompt.py钩子会在主提示流程中执行,选完dev_account后会立即触发子提示- 直接通过
cookiecutter['key'] = value的方式添加变量,无需使用模板语法 - 确保变量名
_aws_dev_account_id在钩子和模板中保持一致,避免未定义错误
内容的提问来源于stack exchange,提问作者Rio
相关产品推荐
相关产品推荐

