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')