太陽がまぶしかったから

C'etait a cause du soleil.

GitHub の Repository Template 機能で既存のボイラープレートリポジトリを依存関係なく新しいリポジトリに複製する

f:id:bulldra:20210516105910j:plain

テンプレート的な既存リポジトリを依存関係なく複製したい

 Python でちょっとしたツールを作る時に毎回毎回同じようなコードを書くのも面倒なので、 GitHub に定型コードを集めたリポジトリを作って git clone や fork を使ってリポジトリを複製していたのだけど、それも面倒に感じていた。

 clone / pull してから git のコマンドで依存関係を切って別のリモートリポジトリをに push し直す作業は不毛だし、ツール個別の支流開発が二度と親リポジトリに戻ることはないのに fork するのも正しくない。複製数の制限にも引っかかる。

 そんな時には GitHub の Repository Template 機能を利用することで、ボイラープレート的なリポジトリの依存関係を気にせずに新しいリポジトリに複製してくれる。Repository Template には以下の特性がある。

  • ひとつのリポジトリからいくつでも複製を作成可能
  • 元となったリポジトリのコミット履歴を継承しない

 簡単な手順で親リポジトリとの依存関係を切って自分用の新しいリポジトリを生成できるのが強み。まさにボイラープレートをテンプレート的に利用するための機能だ。

ボイラープレートコードとは?

ボイラープレートコード (英: boilerplate code、または単にボイラープレート) は、コンピュータプログラミングでは、殆ど、または全く変化することなく、複数の場所で繰り返される定型コードのセクションのこと。冗長な言語を使用する場合、プログラマーはコードを少しだけ書くだけでも多くのコードを作成する必要がある。このような定型コードはボイラープレートと呼ばれる。

 ボイラープレートコードとは、設定ファイル入力、ログ出力、引数解釈やなどの汎用的ではないが典型的な定型コードをまとめたもの。フレームワークやライブラリ自体は疎結合かつ柔軟なカスタマイズが可能なように作成されるべきだが、それを利用する側にかかれるコードの「いつもの感じ」は複製的にせざるを得ない。

 僕自身のために作成した python 用ボイラープレートでは .gitignore、Dockerfile、pytest 環境なども含めておくことで、コードを書き始めるまでのハードルを下げたいという意図がある。Docker さえインストールしてあれば Python 環境やライブラリインストールもホスト環境を汚さずに仮想コンテナ内に展開できる。

既存リポジトリを Repository Template に変更する手順

f:id:bulldra:20210516105907j:plain

 ボイラープレートリポジトリを Repository Template に変更するためには、GitHub リポジトリの Settings で「Template repository」にチェックを入れるだけ。

f:id:bulldra:20210516105910j:plain

 このように、「Use this template」というボタンが出てくるので、クリック。

f:id:bulldra:20210516105915j:plain

 ボイラープレートを依存関係なく複製して新しいリポジリを手軽に作成可能。あとは普通に pull して開発スタートだ。

ボイラープレート側修正の取り込みをしたいのか?

 fork した元の親リポジトリの変更を取り込む Fetch upstream 機能ができたことで、fork させるのもありになってきたが、逆にいえば過去に作ったツール群との後方互換性などを考えていくのもしんどい。

 繰り返しになるがボイラープレートはフレームワークやライブラリではない。あくまで過程的なものとして、依存関係を切って新しいリポジトリを作る際には「その時点での最新」を複製する方針のが結果的に良いと考えている。

 そんなわけで、 GitHub の Repository Template 機能を用いてボイラープレート的なリポジトリを新しいリポジトリに複製していくと簡単に新しいツールを作り始められて便利だ。

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

  • 作者:湊川 あい
  • 発売日: 2017/04/21
  • メディア: 単行本(ソフトカバー)