Fortgeschrittene Nutzung

Hooks

Ihr könnt sog. Pre- oder Post-Generate-Hooks schreiben, di entweder vor oder nach dem Generieren der Vorlage in den Ablauf eingehängt werden. Dabei werden die Jinja-Template-Variablen in die Skripte integriert, z.B.:

if 'Not open source' == '{{ cookiecutter.license }}':
    remove_file('LICENSE')

In einem Pre-Generate-Hook können z.B. Variablen validiert werden:

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(f'ERROR: {module_name} is not a valid Python module name!')

    # exits with status 1 to indicate failure
    sys.exit(1)

Konfiguration

Wenn ihr Cookiecutter häufig verwendet, empfiehlt sich eine eigene Konfigurationsdatei: ~/cookiecutterrc, z.B.:

default_context:
    full_name: "Veit Schiele"
    email: "veit@cusy.io"
    github_username: "veit"
cookiecutters_dir: "~/.cookiecutters/"
replay_dir: "~/.cookiecutter_replay/"

Wiederholung

Beim Aufruf von cookiecutter wird eine json-Datei angelegt in /.cookiecutter_replay/, z.B. ~/.cookiecutter_replay/cookiecutter-namespace-template.json:

{"cookiecutter": {"full_name": "Veit Schiele", "email": "veit@cusy.io", "github_username": "veit", "project_name": "vsc.example", "project_slug": "vsc.example", "namespace": "vsc", "package_name": "example", "project_short_description": "Python Namespace Package contains all you need to create a Python namespace package.", "pypi_username": "veit", "use_pytest": "y", "command_line_interface": "Click", "version": "0.1.0", "create_author_file": "y", "license": "MIT license", "_template": "https://github.com/veit/cookiecutter-namespace-template"}}

Wenn ihr dies diese Informationen erneut verwenden wollt ohne diese erneut in der Kommandozeile bestätigen zu müssen, könnt ihr z.B. einfach folgendes eingeben:

$ cookiecutter --replay gh:veit/cookiecutter-namespace-template

Alternativ kann auch die Python-API verwendet werden:

from cookiecutter.main import cookiecutter
cookiecutter('gh:'veit/cookiecutter-namespace-template, replay=True)

Diese Funktion ist hilfreich, wenn ihr z.B. ein Projekt aus einer aktualisierten Vorlage erstellen wollt.

Auswahlvariablen

Auswahlvariablen bieten verschiedene Möglichkeiten beim Erstellen eines Projekts. Abhängig von der Wahl des Benutzers rendert die Vorlage diese anders, z.B. wenn in der cookiecutter.json-Datei folgende Auswahl angeboten wird:

{
  "license": ["MIT license", "BSD license", "ISC license", "Apache Software License 2.0", "GNU General Public License v3", "Other/Proprietary License"]
}

Dies wird dann ausgewertet in cookiecutter-namespace-template/{{cookiecutter.project_name}}/README.rst

{% set is_open_source = cookiecutter.license != 'Not open source' -%}
{% if is_open_source %}

{%- endif %}

{% if is_open_source %}

{% endif %}

und in cookiecutter-namespace-template/hooks/post_gen_project.py:

if 'Not open source' == '{{ cookiecutter.license }}':
    remove_file('LICENSE')