ジンジャー研究室

長めのつぶやき。難しいことは書きません。

GISC : Scaffolding のネタを Git のリポジトリから取ってくるツール作った

f:id:jinjor:20181107032402p:plain:w200

github.com

GitHub の適当なリポジトリを Scaffolding の元ネタに使っちゃおうぜ というツールを作った。

Git で Scaffolding なので GISC 。大文字でも小文字でも可。gisc という名前にしたら disc っぽかったのでそういうロゴにした。ちなみにロゴは会社帰りに iPhone のメモアプリで描いた(便利!)。

使い方

インストール。

npm install -g gisc

jinjor/gisc リポジトリexample ディレクトリをコピって my-project を作る。デフォルトだとサーバーが github.com 、プロトコルhttps 、ブランチは master 。 depth は常に 1 。キャッシュはしない。

gisc get jinjor/gisc example my-project

これでもまだ長いので alias を作って同じことをする。

gisc add ex gisc example
gisc ex my-project

サブコマンドは get ls add remove share がある。alias は ~/.gisc に保存される。

モチベーション

Elm で main 関数を書くハードルが高い。 というのは、 Elm はフレームワークを組みこんだような言語なので、 init, model, view のような決まった関数をいくつか用意しないとスタートラインに立てない。書き方がいくつかあって、 SPA 機能を組み込んだ最終形態が これ 。main だから1アプリに一つなんだけど、色々と試したり遊んだりサンプル作ったりするので、なんやかんや作る機会が多い。その度にどこかからコピってきてた。

実は elm init というコマンドがあるんだけど、このコマンドは elm.json しか作ってくれない。というか、本当は Main.elm を作る機能があったんだけど 0.19 リリース直前に削除された。まあ、こういうふわふわしたものを作って「自分の好みとちょっと違う」とか文句を言われたり自分で管理するのが嫌なんだろう。

そういえば昔そんなツールあったよねと思い出したのが elm-new なんだけど、残念ながらメンテされてない。まあ OSS なんてそんなもん 。フォークしてもいいけどあんまり好みの構成になってないというか、純 Node だったらなあみたいな気持ち。

で、そういうことをするのは Scaffloding と言って昔からツールがあるよね、ということで一昔前に話題になった Yeoman とかも見たんだけど、正直使ってるという話を聞いたことがないし、前にちょっと触った時はとにかく使い方が難しくて「どうしてテンプレートをコピーするだけのためにこんなに大掛かりな物が必要なんだ」と思った記憶がある。

もう少し調べると giter8 というのがあって、でもこれは Scala プログラマ向けっぽい匂いがする。 Node がいいよなーと思ったんだけど、いまいち「これ!」という物が見つからない。

よくよく考えると GitHub から取ってきてコピーすればいいだけなんだから、GitHub の raw ファイルを curl で取ってくればいいんじゃないかと思ったんだけど、まあ URL 長くて覚えられないので管理を簡単にしたい。あと、ディレクトリがコピー出来ない。他にも rsync とか scp とか、それの Git 版(?) みたいなやつを検討したけど、どれも今回の目的にはマッチしないなという感じ。

この辺まで調べてようやく「どうやら既存のいいものは無さそう」と思い始め、同時に 車輪を作る理由を得た

こだわった部分

とにかくシンプルかつ簡単にしたかった。

名前は最初 gitscaf って名前だったんだけど、7文字も打つのはかったるいし 自分がコマンド名を覚えられなかった ので短くした。4文字なら使う気になる。

テンプレート機能はつけない。そんなことをしたら難しくなる。コピペして書き直せばいい。

最初は get しか出来なかったけど、長くなると覚えられないので addエイリアスを登録できるようにした。せっかく alias を登録しても覚えられなければ意味がないので ls は必須。--help も。とにかく記憶力がないと使えないので CLI は嫌いだ。

あとは独自ルールも排除。最初「 init という実行ファイルが置いてあったらそれを実行する」みたいのも考えたけど、それを説明するのも面倒臭い。それに色んな人をエコシステムに巻き込むコストが高い。第一そんな物があると pre だの post だの色々欲しくなってしまう。セキュリティもある。とにかく面倒なのでやめた。

ローカルのファイル・ディレクトリは登録できない。それをするとマシンを跨いで作業した時にデータがなくなって後悔するので、最初からリモートのみにする。

contrib みたいな中央集権的なこともしない。何もメンテしたくないし、ブロックもしたくない。思うのと違ったら勝手にフォークするなり別のリポジトリから取ってもらいたい。

既に十分便利なんだけど、良い設定が出来たら他の人にもシェアできるように share コマンドを作った。gisc share コマンドを実行するとエイリアスを登録するためのコマンドが出る。

$ gisc share
gisc add elm.button evancz/elm-architecture-tutorial examples/01-button.elm
gisc add elm.field evancz/elm-architecture-tutorial examples/02-field.elm
gisc add elm.form evancz/elm-architecture-tutorial examples/03-form.elm
gisc add elm.random evancz/elm-architecture-tutorial examples/04-random.elm
gisc add elm.time evancz/elm-architecture-tutorial examples/05-time.elm
gisc add elm.http evancz/elm-architecture-tutorial examples/06-http.elm
gisc add elm.sandbox jinjor/gisc-elm src/sandbox.elm
gisc add elm.element jinjor/gisc-elm src/element.elm
gisc add elm.document jinjor/gisc-elm src/document.elm
gisc add elm.application jinjor/gisc-elm src/application.elm
gisc add elm.package jinjor/gisc-elm elm.package.json
gisc add elm.index jinjor/gisc-elm index.html

コピペするだけでエイリアスをサクッと追加できる。他にも色々アイデアはあるので、とりあえず ここ にまとめた。(飽きっぽいので続く保証はない)

作ったテンプレート

というわけで、 Elm 用のテンプレ作った。

嬉しい!やったね!