まとめ
これまでのあらすじ
fishを使う上で、$HOME/.config/fish/functions/配下のファイルの管理について下記の点が気になり始めました。
-
$HOME/.config/fish/functions/配下にファイルがフラットに配置されている - 複数の
functionが連携して別の機能を実現している場合に、どのファイルが連携しているのかわかりにくい
プラグインマネージャーを使うとプラグインという論理的な単位で管理することができますが、fishermanを使ってプラグインをインストールすると$HOME/.config/fish/conf.d/や$HOME/.config/fish/functions/といったディレクトリー配下にシンボリックリンクが配置されます。プラグインマネージャーは使いたいけれど、シンボリックリンクが作られるという点が肌に合いませんでした。
1ヶ月程度fishを使い慣れてたということで、fish自体の機能の勉強と各プラグインがどのような構造になっているのかの調査を兼ねて、シンプルなプラグインマネージャーを作ることに決めました。
開発にあたって
開発にあたっては開発方針を下記3点としました。
- シンボリックリンクを使わない
- プラグインはghqで管理する
- oh-my-fishやfisherman向けのプラグインも管理できる
シンボリックリンクを使わない
fishでは$HOME/.config/fish/functions/配下にファイルを配置しておくとオートロードされる仕様(参考リンク)ですので、fishermanが行っているシンボリックリンクをfunctions/配下に配置するというアプローチは合理的な方法です。しかし、これがどうしても気に入らなかったのです。
シンボリックリンクでオートロードというソリューションを使わずファイルを読み込む手段としてsourceが使えそうです。ということで、各プラグインのファイルをsourceするコードを書くというアプローチを採用することにします。
プラグインはghqで管理する
普段からリポジトリーの管理にはghqという便利なツールを使っているので、GitHubに公開されているプラグインの管理にもghqを使いたいと考えました。
frescoを使うためにghqが必要になってしまいますが、携わっているプロジェクトや普段使いのプラグインのリポジトリーを統一的に管理できるのはとてもスッキリします。
oh-my-fishやfisherman向けのプラグインも管理できる
fishには既に多数のプラグインが存在します。
これらの資産を活用しない手はありませんので、下記仕様に対応することにします。
-
fishfileに依存するプラグインが記載されている -
uninstall.fishという後始末スクリプトを準備しておくとプラグイン削除時に呼ばれる
見落としている仕様があれば教えていただけると助かります。
fresco誕生
そんなわけでfrescoができました。
インストール
ghqが入っている状態で下記コマンドを実行することでfrescoをインストールすることができます。
$ curl https://raw.githubusercontent.com/masa0x80/fresco/master/install | fish
このコマンドは内部で下記を実行しているだけです。
-
ghqでfresco自体をダウンロード -
source (ghq root)/github.com/masa0x80/fresco/fresco.fishを行う$HOME/.config/fish/conf.d/fresco.fishを作成
frescoの使い方
プラグインの追加
例として、sharkをインストールしてみます。
$ fresco fisherman/shark
Download /Users/masa0x80/.ghq/github.com/fisherman/shark
Download /Users/masa0x80/.ghq/github.com/fisherman/getopts
Enable fisherman/shark
frescoでインストールされたプラグインは$HOME/.config/fish/plugins.fishファイルに記録されるので、確認してみましょう。
$ cat $HOME/.config/fish/plugins.fish
fisherman/getopts
fisherman/shark
fresco listでもfresco管理下のプラグインを確認できます。
$ fresco list
fisherman/getopts
fisherman/shark
インストールができたようなのでsharkコマンドを試してみます。
$ seq 8 | shark
▁▂▃▄▅▆▇█
無事インストールできたようです。
プラグインの更新
プラグイン名を指定してfresco updateを実行することで、特定のプラグインを更新することができます。
$ fresco update fisherman/shark
fresco管理下のプラグインすべてを更新することもできます。
$ fresco update --all
fresco自体を更新したい場合は--selfオプションを指定してください。
$ fresco update --self
プラグインの無効化・削除
プラグインが不要になった場合は下記コマンドで無効化できます。
$ fresco remove fisherman/shark
なお、--forceオプションを付けて実行することで、ghq管理のリポジトリーごと削除することができます。
$ fresco remove --force fisherman/shark
おわりに
frescoはイタリア語で「新鮮な」という意味です。
よろしければ鮮魚をご賞味ください。