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