如何在嵌套目录中两次运行Cookiecutter?现有结构执行遇阻
核心思路
借助Cookiecutter的后置钩子(post-gen-project),在第一次渲染外层模板(生成project_slug命名的目录)完成后,自动触发第二次Cookiecutter渲染,处理内层的package_type变量,实现分阶段填充模板的需求。
具体操作步骤
1. 调整外层模板结构
在外层folder1目录下新增钩子目录及脚本文件:
/folder1 /{{cookiecutter.project_slug}} /src /{{cookiecutter.project_slug}}{{cookiecutter.package_type}} test.py main.py README.md cookiecutter.json cookiecutter.json /hooks post-gen-project.py # 新增后置钩子脚本
2. 编写后置钩子脚本
post-gen-project.py负责触发第二次渲染,代码如下:
import os import subprocess import sys # 获取第一次渲染生成的项目目录路径 project_dir = os.path.join(os.getcwd(), "{{cookiecutter.project_slug}}") os.chdir(project_dir) # 运行第二次Cookiecutter渲染,指定当前目录为模板源 result = subprocess.run( [sys.executable, "-m", "cookiecutter", ".", "--no-input"], capture_output=True, text=True ) # 错误处理 if result.returncode != 0: print("第二次渲染失败:", result.stderr) sys.exit(1) # 可选:删除内层的cookiecutter.json,避免后续误操作 os.remove("cookiecutter.json")
3. 修正JSON语法错误
你的两个cookiecutter.json使用了=赋值,不符合JSON规范,必须改为::
- 外层
folder1/cookiecutter.json修正后:
{ "project_slug": "project name" }
- 内层
{{cookiecutter.project_slug}}/cookiecutter.json修正后:
{ "package_type": "regular" }
4. 执行渲染
直接运行外层模板即可自动完成两次渲染:
cookiecutter /path/to/folder1
如果需要交互式输入package_type,删除钩子脚本中的--no-input参数即可。
补充说明
- Linux/macOS环境下需给钩子脚本添加可执行权限:
chmod +x hooks/post-gen-project.py,Windows无需额外设置。 - 内层的
cookiecutter.json在第二次渲染后可根据需求保留或删除。
内容的提问来源于stack exchange,提问作者tamarlev
相关产品推荐
相关产品推荐

