progrhyme's tech blog

主にIT関連の技術メモ

Hello basher, Goodbye to clenv

TL;DR

自作のシェルスクリプト・パッケージ管理ツール「clenv」から、「basher」に移行したという話。

basherそのものの機能や使い方についてはQiitaにエントリを書いたので、興味のある方はそちらをどうぞ:

あらすじ

4年前〜clenv開発

シェルスクリプトのパッケージ管理ツールがほしくなり、なぜか良い物が見つけられなかったので自作してしまったのは、ちょうど4年前のことだった。

コミットログによると、2016年の4月にガッと作って、6月ぐらいまでちょこちょこいじり、9月にまた多少機能追加して、それからずっと放置していた。
ので、実装の詳細はもうあまり記憶にもないのだけど、元々自分で欲しくて作ったものということもあり、一応ずっと使い続けていた。

basherとの出会い、そして移行

最近久しぶりにclenvを改良しようかという気になり、色々とイケてないところを直したくなったのだが、そんなときに自分が欲しかった機能がclenvよりもすっきりとミニマルにまとまっているツールを見つけてしまった。

それがbasherである。

https://github.com/basherpm/basher

一度、ある環境でclenv -> basherの移行を試してみたところ、問題がなかったので、その後数日かけて自分がよく触れる全てのシェル環境でclenv -> basherに切替えた。

そんなわけなので、今後clenvに手を加えることはたぶん、もうないと思う。
元々世界にたった1人のユーザーだったと思うけど、これでゼロになったと思われる。

そもそも解決したかった課題

  1. 私はシェルスクリプトで書いたツールをいくつかのリポジトリに分けて置いているのだけど、どの環境でもそれらを使いたかった。が、git submoduleをあまり増やしたくなかった。
  2. 4年前はシェルスクリプトのライブラリを簡単に使えるようにして、シェルプログラムを簡単に高度化できるような世界を妄想していたようだが、具体的に解決したい問題があったわけではない。

1については、4年前当時からそうで、今も状況は変わっていない。

clenvでできていたこと

上の1つ目の課題は解決した。
Clamfile というファイルにインストールしたいパッケージ(リポジトリ)のリストを書いて、 clam -r Clamfile とすると全部一発で入るようにした。

2つ目の要求については、一応それっぽく動く機能を作ったところで止めてしまった。

clenvの課題

  • パッケージ(インストール対象のリポジトリ)に clam.spec というファイル(いくつかの変数を定義したシェルスクリプト)を置かないといけないという仕様があり、自作ツール以外のものを使いにくい
  • シェルスクリプトをライブラリ的に使いたいときのインタフェースが、今思うとちょっとイケてない
  • (その他色々あるけど、誰も興味がないので割愛)

basherの良い点と得られた恩恵

  • パッケージ内の bin/ ディレクトリ下、またはルート直下の実行ファイルを見つけて実行パスにsymlinkを作ってくれる
    • package.sh というファイルを置くことで対象となる実行ファイル等をカスタマイズすることもできる
  • シェルスクリプトライブラリを include 関数でいい感じに読み込める( .source 相当の関数)

この2点がclenvよりイケてたので、basherへの移行を決心した。

自分にとっては特に include によって得られた恩恵が大きく、自作のgcloud-promptだけでなく、jonmosco/kube-ps1b4b4r07/enhancdinclude で読み込むようにしたので、自分の環境(≒dotfiles)から更にgit submoduleを減らすことができた。

basherの不具合と、不足機能への対処

Qiitaにも書いたが、1点不具合があった。
macOSで素の状態だと basher link コマンドがエラーになるという問題だ。
これについては、Homebrewでcoreutilsをインストールすると回避できる。
修正PRも送ってみたけど、音沙汰がない。)

また、clenvだと上に述べた Clamfile の作成によって、パッケージリストを管理できるのだけど、basherにはそういう機能はなかったので、適当にシェル変数で配列を定義して、パッケージリストをまとめてインストール・更新するようにした。

まとめ

以上のように、自作のシェルスクリプト管理ツールである「clenv」から「basher」に乗り換えた。

次回予告(?)

性懲りもなく、またシェルスクリプトのパッケージ管理ツールをGo言語で作ったので、その話もまた近い内に書こうと思う。