業務で使うプロジェクトフォルダやGitリポジトリをボイラープレートツールを使ってテンプレート化する:copier


この記事は、Python Advent Calendar 2023の21日目の記事です。

20日目は森山さんによる NdArrayを例にPythonのTypeVarTupleの力を確認する でした。TypeVarTupleはつかったことなく知らなかったので勉強になります。型表現が良くなるのは助かりそう。

会社の業務効率化のためのツール開発

本業の機械系設計事務所では、今年は業務効率化に取り組む一年でした。その時に使ったツールの1つがcopierです。

多分テック系でもですし、何らかの業務に共通することになりますが、お客さんからの依頼案件では、毎回同じようなフォルダー構成のプロジェクトを作ることが多いです。たとえば、依頼案件専用の設定ファイルや、スムーズに作業するためにテンプレート化したプロジェクトファイルなどです。

本業の会社では、3Dモデリングをして機械設計を行うので、3DCADのプロジェクトファイル(いろんな呼び方があるのでこれに統一してます)、案件専用の品質管理用のチェックシートや計算用のExcelファイルなどがあります。これらのファイルに名前や中身のファイルへ依頼専用の管理番号などを入力した上で利用しています。

実は最近まで案件の量などもあり、これらのフォルダー構成を毎回手動で作っていました。ただ最近依頼業務が増えたり大口で依頼を受けたりするようになってきたので、これらのフォルダー構成を自動で作るツールを作ることにしました。

ボイラープレートとは

ボイラープレートというと、ボイラーのプレートという意味で、ボイラーの外側に貼り付けるボイラーに取り付けられる製造所などを記した金属板を指します。(by wikipedia

この言葉は広告業界でも使われる言葉で、繰り返し使う文字列やデザインなどのテンプレートを指します。

ところで、テンプレートというと設計業では馴染みのあるアレです。これもテンプレートですね

copierとは

プログラミングの世界でも、テンプレートはよくある方法論です。そういったツールは多数あるのですが、ここではPython製のcopierを紹介します。

copier

copierはコマンドラインツールでもあり、Pythonのコードでも利用できるツールです。ローカルのフォルダーやGitリポジトリをテンプレート化できます。

内部的にはjinja2を使っているようで、テキストベースのファイルならファイル名(拡張子含む)の末尾に .jinja をつけることで、ファイルの中身にもテンプレート変数を埋め込むことができます。

使い方

詳しくは公式ドキュメントなのですが、ざっくり使い方をご紹介。

テンプレート用のフォルダー構成を作る

ここではローカルのフォルダーをテンプレート化する方法を紹介します。まずはテンプレート用のフォルダーを作ります。

# 操作しやすくするために、操作用のフォルダーを作る
mkdir copier_exam
cd copier_exam
# 操作用のフォルダーの中にテンプレート用のフォルダーを作る
mkdir mytemplate
cd mytemplate

ここでファイルをいくつか作ります。上記でも書いたのですが、.jinjaファイルはテキストファイルの内部にテンプレート変数を埋め込むことができ、最終的に.jinjaを取り除いたファイルが生成されます。

touch file-{{project_number}}.txt
touch file2.txt
mkdir dir1
touch dir1/file3-{{project_date}}.txt.jinja
# file-{{project_number}}.txt.jinjaの中身
# {{project_number}}: 依頼番号
# {{project_date}}: 依頼日時

次にテンプレート変数へどういった質問をするかの設定ファイルを作ります。typeは入力する値の型を指定します。文字列や数字や真偽値ぐらいの指定ができます。

touch copier.yml

# ---copier.ymlの中身---
# project_number:
#   type: str
#   help: プロジェクト番号は?
# project_date:
#   type: str
#   help: プロジェクトの依頼日時は?(yyyy-mm-dd表記で)

参考: Configuring a template - copier

my_templateの中身がこういう形になると思います。

copier_exam
└─my_template
    ├─copier.yml
    ├─dir1
      └─file3-{{project_date}}.txt.jinja
    ├─file-{{project_number}}.txt
    └─file2.txt

Gitリポジトリは、このmy_templateフォルダーをGitリポジトリとしてinitした上でGitHubや社内のGitリポジトリにpushします。

そして参照できるURIを、この先のコマンドやコード内で指定するテンプレートのパスにすることで、自動的に読み込んで生成してくれます。

コマンドで実行する

copier copyコマンドを使って、テンプレートをコピーします。

copier copy <テンプレートのパス> <出力先のパス>

コマンドラインツールで生成させると質問に答えることで、テンプレート変数の値を入力できます。

copier_exam % copier copy ./my_template ./generated_project 
No git tags found in template; using HEAD as ref
🎤 プロジェクト番号は?
   SND0001
🎤 プロジェクトの依頼日時は?
   2023-12-21
Copying from template version 0.0.0.post1.dev0+b01d787
    create  .
    create  file2.txt
    create  dir1
    create  dir1/file3-2023-12-21.txt
    create  file-SND0001.txt

この時に、コマンドに設定した変数に入れる値を指定する引数(-dオプション)を指定することもできます。

# copier copy <テンプレートのパス> <出力先のパス> -d <変数名>:<値>
copier_exam % copier copy ./my_template ./generated_project2 -d project_number=SND0002 -d project_date=2023-12-21
No git tags found in template; using HEAD as ref

Copying from template version 0.0.0.post1.dev0+b01d787
    create  .
    create  file2.txt
    create  dir1
    create  dir1/file3-2023-12-21.txt
    create  file-SND0002.txt

割愛しますが、テキスト以外にも、単一、複数選択などの選択した値をテンプレート変数に入れることができます。またデフォルトの値を設定することもできます。

こちらにある程度記載があるので、参考にしてください。

Configuring a template - copier

Pythonのコードで利用する方法

Pythonのコードで利用する場合は、copier.run_copyを使います。

テンプレート変数で入力する値は、copier.run_copyの引数で指定できます。

## copier_exam.py
import copier

data = {"project_number": "SND0003", "project_date": "2023-12-21"}
copier.run_copy("./my_template", "./generated_project3", data)
copier_exam % python copier_exam.py

実行すると、同じように生成されます。Pythonコード上で利用したいときもシンプルに扱えます。

(ちなみにdataを空にすると、コマンドラインツールと同じように質問に答えることで入力できます)

まとめ: テンプレート化すると何が良いか

社内での活用としては、依頼案件の連絡情報をPythonで自動で収集した上で、その情報を元にテンプレートを生成しています。

テンプレート化すると同じようなフォルダー構成を作る手間が省ける。というだけなのですが、これがとても効果絶大でした。というのも手作業は大抵はミスが起こるし、どれだけ慣れていてもコピペ作業やファイル名変更はキー入力やマウス操作はそれなりに必要になります。

単純比較で、手作業で5~10分程度かかる作業が数秒で済む、さらに間違いがないといえば、効果の想像はしやすいかなと思います。

実際に作業していたときは注意してやらなければいけないものでストレスも多い作業でしたが、今はその存在すら忘れるぐらいになりました。慣れた工程になると意外と気が付かない部分ですが、ちりつもの積み重ねで、ストレスも減らせるので良い効果です。

そのうちにファイル名変更などはAIが自動的にレコメンドしてくれるような時代になってくるかもしれませんが、その時まではこういったツールで効率化していくと良いと思います。

宣伝

弊社の宣伝です! 自動車プレス金型の機械設計を行う設計事務所で、製品や試作品の3Dモデリングのお仕事も受け付けています。

また製造業で上記記事で扱う作業の自動化やその先に繋がるデジタル化、DXに取り組みたい方もご相談承っております。 面倒なファイル作業の自動化や業務の流れを止めないためのツール開発なども可能です。

ぜひお気軽にお問い合わせください!

おまけ1: ボイラープレートとテンプレートの違いとは

参考: https://qiita.com/e99h2121/items/995671a83be1fa7b74bf

(私も厳密には分けられないと思いました💦)

おまけ2: 利用したcopierのテンプレート

GitHubリポジトリからダウンロード可能です。

hrsano645/copier_exam