nikkie-ftnextの日記

イベントレポートや読書メモを発信

nikkieとCookiecutter 第1話 🍪 「テンプレートを使う。そしてチュートリアルに沿って作る」

はじめに

久美子部長、お誕生日おめでとうございます!1 nikkieです2

クッキーカッター(Cookiecutter)ってあるじゃないですか〜。
わたし〜、にっきー(nikkie)じゃないですか〜。
ぜったい相性いいと思うんですよね〜3

というわけで触ってみました!

目次

Cookiecutterとは

私(にっきー)の遠い親戚です!

テンプレートに沿って、ファイルやディレクトリ一式を作ってくれるツール(ライブラリ)です。

テンプレート1つ1つをcookiecutter(型にはまった、お決まりの ref:『ウィズダム英和辞典』)というようです。
Djangoを触ったことがある方向けに言うと、命名規則に沿ったプロジェクトやアプリケーションをコマンド4で作るあのイメージです。

インストール

https://cookiecutter.readthedocs.io/en/latest/installation.html

  • pip install cookiecutter
  • macOSではbrew install cookiecutterもできるようです

(仮想環境に)pipでインストールしました

  • Python 3.10.9
  • Cookiecutter 2.3.0

使い方

インストールするとcookiecutterコマンドが使えるようになります。
あとはテンプレート(これもまたcookiecutter)を指定し、ファイルやディレクトリ一式を生成するだけ。

cookiecutter <template指定>とすると、対話的に設定しながらファイルやディレクトリ一式を生成できます

公開されているテンプレートの利用は、巨人の肩に乗る6ではないでしょうか7
色々調べて最終的にテンプレートの構成に行き着くよりは、テンプレートを導入してそこを出発点にするほうが進みは早いと思います。
最初はテンプレートに則ります(守)が、徐々にテンプレートを工夫したくなり、自分でテンプレートを生み出すこともある(破)のかなと想像します。

Cookiecutterのテンプレートを私も作ってみたい!

使うだけじゃなくて「作ってみたい!」と思ったのです。
そこでチュートリアルの「Create a Cookiecutter From Scratch」を進めていきます。

簡単なテンプレート(HTML)を作ります。
作業ディレクトリはこんな感じになります。

.
├── venv  # pip install cookiecutterした仮想環境
└── cookiecutter-website-simple/  # mkdirする
    ├── cookiecutter.json
    └── {{ cookiecutter.project_slug }}/  # 独特なディレクトリを作る
        └── index.html

cookiecutter.json

Step 2のところです。
Cookiecutterが使う変数名とデフォルト値を設定します。

{
    "project_name": "Cookiecutter Website Simple",
    "project_slug": "{{ cookiecutter.project_name.lower().replace(' ', '_') }}",
    "author": "Anonymous"
}

このJSONの指定が対話的な設定で参照されます

{{ cookiecutter.project_slug }}/index.html

Step 3と4です。

{{ cookiecutter.project_slug }}はcookiecutterの変数project_slugを参照する書き方。
この変数は先のcookiecutter.jsonで宣言されています。
project_slug変数の値を参照してディレクトリを作るということですね。

そのディレクトリの中にはindex.htmlを置きます。
こちらもcookiecutterの変数を使っています。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>{{ cookiecutter.project_name }}</title>
</head>

<body>
    <h1>{{ cookiecutter.project_name }}</h1>
    <p>by {{ cookiecutter.author }}</p>
</body>

</html>

自作したテンプレートを指定してcookiecutterコマンドを実行

作業ディレクトリのルート(venvがあるところ)に移動し、以下のコマンドを叩きます(対話的な設定例も示しました)。
cookiecutterコマンドには、(URLを指定する代わりに)相対パスでテンプレートのディレクトリを指定しています

% cookiecutter cookiecutter-website-simple
  [1/3] project_name (Cookiecutter Website Simple): Awesome Example
  [2/3] project_slug (awesome_example):
  [3/3] author (Anonymous): nikkie

するとawesome_exampleディレクトリとその中にindex.htmlができました!🙌

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Awesome Example</title>
</head>

<body>
    <h1>Awesome Example</h1>
    <p>by nikkie</p>
</body>

</html>

チュートリアルのStep 5と6にあたります。
Step 5ではZIPに固めていますが、ドキュメント中にZIPにまとめずにローカルファイルパスで指定する例8を見かけていたので、手順の少ないそちらを試しました。

終わりに

Cookiecutter、なかなか好感触です!
名前自体は前々から聞いてはいましたが、ようやく「こういうときに使えるかもな〜」と使い所が浮かぶようになってきた感じです。

一度にファイルをたくさん作ってくれるわけですが、たくさん作られても私がびっくりしなくなったので使っていこうという気持ちになったのもありますね。
みんなのオススメのCookiecutterテンプレートも教えてほしいなア!


  1. 久美子部長は私のTwitterアカウントアイコンの方です。「うまくなりたい」に心打たれたなあ...
  2. さらに田井中部長とちゆちぃもおめでとうございます!
  3. 韻は踏んでるんじゃないかな
  4. django-admin startprojectpython manage.py startapp
  5. Yeoman以外にもcookiecutterでもできるんだYO! VSCode拡張開発 素振りの記:ハンズオンテキストを元に「歩夢」を「歩夢🎀」に置き換える拡張を自作し、コマンドとコードレンズを完全に理解 - nikkie-ftnextの日記
  6. 知の高速道路とも言い換えられると思います
  7. 同様の意見はこちら。「Pythonプロジェクトに知見のある人が作ったテンプレートにより、誰でもスタートラインを前にして進めることができるようになります。
  8. Use it at the command line with a local template」 ref: https://cookiecutter.readthedocs.io/en/latest/README.html#for-users-of-existing-templates