のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Cookiecutterを使ってテンプレートからプロジェクトを作成する

Sponsored Links

皆さんこんにちは
お元気ですか。ユニクロの極暖Tシャツ着ているとかなり暑い。。。冬なのに

今日は、Cookiecutterを使ったテンプレートからの複製生成を試みます。
テンプレートからちょっと変えたい部分を用意することで、簡単に
似たプロジェクトを作成できます。

Cookiecutterについて

Cookiecutterは雛形となるテンプレートプロジェクトから
プロジェクトを生成するツールです。
雛形となるプロジェクトを作ってしまえば、少し変更したい箇所を指定して
新しいプロジェクトを作ります。

github.com

インストール

cookiecutterをpypiから取得できます。

sudo pip install cookiecutter

Cookiecutterを使った複製をやってみる。

頻繁に利用がありそうなテンプレートの雛形は既に用意されています。
とりあえず、何も考えずに作ってみましょう。

GitHub - ionelmc/cookiecutter-pylibrary: Enhanced cookiecutter template for Python libraries.の雛形を使用する場合は
次のように実行します。

cookiecutter gh:ionelmc/cookiecutter-pylibrary

途中で色々と聞かれるので必要のある箇所は入力します。

full_name [Ionel Cristian Maries]: tereka
email [contact@ionelmc.ro]:
website [https://blog.ionelmc.ro]:
github_username [ionelmc]:
project_name [Nameless]:
repo_name [python-nameless]:
package_name [nameless]:
distribution_name [nameless]:
project_short_description [An example package. Generated with cookiecutter-pylibrary.]:
release_date [today]:
Select year:
(略)

他にもflaskやdjango、restのプロジェクトがあります。
これで、確認すると変数となっていた箇所が指定した名前に
置き換わっていることを確認できます。
次はテンプレートを構築してみます。

テンプレートを作成に挑戦してみる。

準備されているテンプレートでは不足することもあるでしょう。
そんなときのために、自分で1からテンプレートを作ってみます。

ディレクトリの雛形は以下の通りです。

ディレクトリ構成

treeコマンドを使ってcookiecutterの雛形の構成を表示します。

.
└── TestProject
    ├── cookiecutter.json
    └── {{cookiecutter.project_name_lower}}
        └── README.md
cookiecutter.json

cookiecutter.jsonにcookiecutterの雛形で使う変数を定義します。

{
  "project_name" : "test-project",
  "create_document": "y",
  "license": ["MIT", "BSD-3", "GNU GPL v3.0", "Apache Software License 2.0"],
  "project_name_rower" : "{{ cookiecutter.project_name|replace('-', '_') }}"
}

{{ cookiecutter.<変数名> }}とすることで、その変数を埋め込めます。
また、埋め込んだ変数の文字を"-"→"_"に置換しています。
licenseの箇所はリストにしています。リストをjsonで入力した場合、
対話的に実行する時に候補を表示します。

README.md

プロジェクト内にあるREADME.mdにcookiecutterで
定義した変数を埋め込むテストをします。
今回、テストとして用意した文書は以下の通りです。

{{ cookiecutter.project_name}} document.

{% if cookiecutter.create_document == 'n' -%}
   No Document
{%- endif %}

{% if cookiecutter.create_document == 'y' -%}
{{cookiecutter.license}}

This is an apple.
{%- endif %}

このREADME内で、cookiecutterの変数を使えることは同じです。
追加で、if文を使った条件式を構築できます。上記の場合、
{% if cookiecutter.create_document == 'n' -%}はcreate_document変数がnの場合に動作し、
{% if cookiecutter.create_document == 'y' -%}はcreate_document変数がyの場合に動作します。

実行

コマンドラインからcookiecutter <ディレクトリ>で実行できます。
但し、ディレクトリ内にcookiecutter.jsonがないと実行できません。

$ cookiecutter TestProject/
project_name [test-project]: test-project
create_document [y]: y
Select license:
1 - MIT
2 - BSD-3
3 - GNU GPL v3.0
4 - Apache Software License 2.0
Choose from 1, 2, 3, 4 [1]: 2
project_name_lower [test_project]:

cookiecutter.jsonにリストで定義した設定は番号で選択できるようになっています。

作られたプロジェクトを確認する

最後に作ったプロジェクトを確認します。
まず、cookiecutterの変数になっていたディレクトリが
「test_project」の名前になりました。

.
└── test_project
    └── README.md
README.md
test-project document.



BSD-3

This is an apple.

README.mdを見ると、変数名が埋め込まれています。(test-project)
また、create_documentの条件が"n"となっている箇所が表示されていないことを確認できます。
更に、条件式が"y"の時に表示される文章を確認できました。

最後に

cookiecutterを使うと、基本となる雛形から
オリジナルのプロジェクトを簡単に作成できます。

ちょっとだけ変えたプロジェクトを作成したいことは結構あります。
意外に応用できそうなので、もっと使ってみたいと感じています。