Posted at

`fresco`:fish向けプラグインマネージャー

More than 1 year has passed since last update.


まとめ



  • frescoというプラグインマネージャーを作りました


  • frescoではghqを使ってプラグインを管理します


  • fishermanと異なりシンボリックリンクは作りません


これまでのあらすじ

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-fishfisherman向けのプラグインも管理できる


シンボリックリンクを使わない

fishでは$HOME/.config/fish/functions/配下にファイルを配置しておくとオートロードされる仕様(参考リンク)ですので、fishermanが行っているシンボリックリンクをfunctions/配下に配置するというアプローチは合理的な方法です。しかし、これがどうしても気に入らなかったのです。

シンボリックリンクでオートロードというソリューションを使わずファイルを読み込む手段としてsourceが使えそうです。ということで、各プラグインのファイルをsourceするコードを書くというアプローチを採用することにします。


プラグインはghqで管理する

普段からリポジトリーの管理にはghqという便利なツールを使っているので、GitHubに公開されているプラグインの管理にもghqを使いたいと考えました。

frescoを使うためにghqが必要になってしまいますが、携わっているプロジェクトや普段使いのプラグインのリポジトリーを統一的に管理できるのはとてもスッキリします。


oh-my-fishfisherman向けのプラグインも管理できる

fishには既に多数のプラグインが存在します。

これらの資産を活用しない手はありませんので、下記仕様に対応することにします。



  • fishfileに依存するプラグインが記載されている


  • uninstall.fishという後始末スクリプトを準備しておくとプラグイン削除時に呼ばれる

見落としている仕様があれば教えていただけると助かります。


fresco誕生

そんなわけでfrescoができました。


インストール

ghqが入っている状態で下記コマンドを実行することでfrescoをインストールすることができます。

$ curl https://raw.githubusercontent.com/masa0x80/fresco/master/install | fish

このコマンドは内部で下記を実行しているだけです。



  1. ghqfresco自体をダウンロード


  2. 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はイタリア語で「新鮮な」という意味です。

よろしければ鮮魚をご賞味ください。