🦂

Copierでさらにむこうへ

2024/09/20に公開

前回はCopierでテンプレートを作る基本的な手順を紹介しましたが、今回はもう少し深掘りしてみます。
「もっと複雑なテンプレート作りたいけど、どうやるの?」って感じになってる方に向けて、さらに使える機能を紹介していきます。

基本の使い方

Step 1: 複数のテンプレート変数を使ってみる

前回はproject_namelicenseくらいの単純な変数しか使いませんでしたが、もちろんもっと複数の変数を使ってテンプレートをカスタマイズできます。例えば、テンプレートの中に別の設定ファイルとか、複数のディレクトリを作る場合、いろんなパラメータが必要ですよね。

# copier.yml

project_name:
  type: str
  help: "Enter the project name"
  default: "MyCoolProject"

author_name:
  type: str
  help: "Enter the author name"
  default: "John Doe"

use_docker:
  type: bool
  help: "Do you want to use Docker?"
  default: true

これで、プロジェクト名だけじゃなくて、作者名とか、Dockerを使うかどうかのオプションも設定できるようになります。テンプレートファイル内で、{{ author_name }}や{{ use_docker }}みたいに使うと、ユーザーが指定した値を反映できます。

Step 2: 条件付きでファイルを生成する

たとえば、ユーザーが「Dockerを使う」って選んだときだけ、Dockerfileを生成したい場合がありますよね。Copierでは、そんな条件付きのファイル生成も簡単にできます。copier.ymlで指定した変数に応じて、ファイルをスキップしたり、生成したりができます。

Copy code
# copier.yml

_use_docker:
  type: bool
  help: "Would you like to include Docker support?"
  default: true

Dockerfile.jinjaみたいな名前にして、use_dockerがtrueの場合だけ生成されるようにしましょう。CopierはJinja2テンプレートエンジンを使っているので、条件分岐もできます。

Copy code
# Dockerfile.jinja
{% if use_docker %}
FROM python:3.8-slim

WORKDIR /app
COPY . .

RUN pip install -r requirements.txt
CMD ["python", "app.py"]
{% endif %}

これで、Dockerを使うときだけDockerfileが生成されます。使わないときはスキップされます。

Step 3: デフォルトのファイルやディレクトリを無視する

テンプレートを使っていると、たまに「このファイルはデフォルトでは含めたくないけど、後で追加するかもな…」って感じることがありますよね。そんなときは、Copierに無視リストを作って、そのファイルやディレクトリを生成しないようにすることができます。

Copierでは.copier-answers.ymlを使って、生成するファイルやディレクトリを制御します。無視リストに追加することで、特定のファイルを除外できます。

Copy code
_exclude:
  - .git
  - node_modules

これで、Git関連のファイルやnode_modulesフォルダは無視されます。

Step 4: テンプレートのバージョン管理

Copierの強みの一つは、テンプレートのバージョンを管理できることです。たとえば、テンプレートに新機能を追加したときでも、既存のプロジェクトにその変更を適用できます。これができると、プロジェクトを簡単にアップデートできるので超便利です。

まず、copier.ymlにバージョン情報を追加します。

Copy code
_version: "1.0.0"

で、テンプレートを更新したら、このバージョンを更新するだけ。プロジェクトの中でCopierを再度実行すると、新しいバージョンにアップデートするかどうか聞いてきます。

Copy code
copier update path/to/project

テンプレートの変更が自動でプロジェクトに反映されます。もちろん、手動で差分を確認してから適用もできます。これでプロジェクトのバージョン管理がより楽になりますね。

gitからもってくる

Step 1: Copierコマンドでテンプレートを引っ張ってくる

次に、Copierを使ってそのテンプレートを自分のローカル環境に引っ張ってきます。
Copierのコマンドは簡単で、以下のコマンドを使えばOKです。

copier copy https://github.com/username/repository-name path/to/destination

username/repository-nameの部分は、先ほどコピーしたGitHubリポジトリのURLに置き換えてください。path/to/destinationには、テンプレートを展開する場所を指定します。

例えば、こんな感じ。

Copy code
copier copy https://github.com/yourusername/my-awesome-template ./new-project

これで、GitHubのテンプレートがダウンロードされて、指定したフォルダに展開されます。

Step 2: 質問に答えるだけ

Copierは、テンプレートをダウンロードした後に、いくつか質問してくるんですよね。「プロジェクト名は何にする?」とか、「ライセンスはどうする?」みたいなやつです。

まぁ、そんなに難しい質問じゃないんで、気軽に答えてください。Copierがいい感じにプロジェクトを生成してくれます。

Copy code
# Example:
? What's your project name? [default: MyCoolProject]
? Author name: John Doe
? License: MIT

質問に答えたら、自動的にプロジェクトのディレクトリ構造が作成されます。ここまで来たら、テンプレートを持ってくる作業はほぼ終了です。特に何も考えなくても進むのがいいですね。

Step 3: 必要に応じて編集する

テンプレートを引っ張ってきてプロジェクトが生成されたら、あとは自分のプロジェクトに合うようにちょこっと編集するだけです。テンプレートって便利だけど、結局自分用に微調整する部分はありますよね。でも、その微調整が終われば、もうスタート地点がかなり前進してるので、楽になります。

テンプレートをベースにどんどんプロジェクトを進めていきましょう。

まとめ

GitHubからCopierテンプレートを持ってくるのは、思ったより簡単です。
コマンド一発でテンプレートをローカルにダウンロードして、質問に答えれば、プロジェクトが自動生成されます。めちゃくちゃ楽ちんです。

Copierのテンプレートを使えば、プロジェクトの初期設定や構成を一から手作業でやる手間が省けるので、時間も節約できます。GitHubには優れたテンプレートがたくさんあるので、ぜひ活用してみてください。

まぁ、やる気が出たときにでも、さくっとやってみてくださいね。

比較記事 : https://zenn.dev/killy/articles/fc8e0803a295d5
導入記事 : https://zenn.dev/killy/articles/d3f43963848947
追加記事 : https://zenn.dev/killy/articles/391e3e3f33510c

Discussion