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 だったらなあみたいな気持ち。
Yeoman 使ってる人とかいる?聞かないけど。もっと手軽なツールないかな。
— Yosuke Torii / ジンジャー (@jinjor) 2018年11月3日
で、そういうことをするのは 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 用のテンプレ作った。
npm install -g gisc
— Yosuke Torii / ジンジャー (@jinjor) 2018年11月6日
gisc add elm.element jinjor/gisc-elm src/element.elm
gisc elm.element src/Main.elm
これでサクサク Main.elm が作れる。
嬉しい!やったね!