模板工具cookiecutter

使用cookiecutter通过项目模板创建Python项目

安装 cookiecutter

pip install cookiecutter

选择项目模板 A Pantry Full of Cookiecutters

使用模板

下载模板

cookiecutter https://github.com/audreyr/cookiecutter-pypackage
# 从GitHub下载模板
cookiecutter gh:audreyr/cookiecutter-pypackage

根据提示输入项目信息, 然后生成项目

cookiecutter下载的模板会保存在~/.cookiecutter目录下, 可以通过项目名再次使用. 项目的配置信息保存在~/.cookiecutter_replay目录下, 可以通过--replay选项从更新过的模板创建项目.

使用本地模板

# 从本地生成项目
cookiecutter cookiecutter-pypackage

重用模板

cookiecutter --replay gh:hackebrot/cookiedozer

Python中使用cookiecutter

from cookiecutter.main import cookiecutter

# Create project from the cookiecutter-pypackage/ template
cookiecutter('cookiecutter-pypackage/')

# Create project from the cookiecutter-pypackage.git repo template
cookiecutter('https://github.com/audreyr/cookiecutter-pypackage.git')

配置文件

创建~/.cookiecutterrc文件, 保存一些个人信息, 下次创建项目时就可以使用默认信息

default_context:
    full_name: "Audrey Roy"
    email: "audreyr@gmail.com"
    github_username: "audreyr"
cookiecutters_dir: "~/.cookiecutters/"

通过--config-file指定配置文件

cookiecutter --config-file /home/audreyr/my-custom-config.yaml cookiecutter-pypackage

或者设置系统变量COOKIECUTTER_CONFIG

export COOKIECUTTER_CONFIG=/home/audreyr/my-custom-config.yaml

基本原理

cookiecutter使用Jinja2语法将cookiecutter.json文件中的变量name替换模板文件中所有被双{}包裹的标签(可以是文件名, 目录名, 文件内的字符串), 然后生成项目.

创建模板

项目结构

cookiecutter-something/
├── {{cookiecutter.project_slug}}/
├── hooks
│   ├── pre_gen_project.py
│   └── post_gen_project.py
└── cookiecutter.json
  • cookiecutter.json - 设置配置变量, 变量的值也可以使用Jinja2语法标记, 如
{
  "project_name": "My New Project",
  "project_slug": "{{ cookiecutter.project_name|lower|replace(' ', '-') }}",
  "pkg_name": "{{ cookiecutter.project_slug|replace('-', '') }}"
}
  • hooks/ - 生成项目时会执行hooks文件内的脚本
# hooks/pre_gen_project.py
import re
import sys


MODULE_REGEX = r'^[_a-zA-Z][_a-zA-Z0-9]+$'

module_name = '{{ cookiecutter.module_name }}'

if not re.match(MODULE_REGEX, module_name):
    print('ERROR: %s is not a valid Python module name!' % module_name)

    # exits with status 1 to indicate failure
    sys.exit(1)
  • 其他地方按照正常方法创建项目, 然后将需要替换的地方用Jinja2语法标签标记即可

参考


  TOC