2020-05-19

5/19

basherを使ってみた

昨日見つけたbasherがclenvを置き換えられそうだったので、試してみた。

作業環境はUbuntu 18.04.

Install

READMEの通りにやってみる。

$ git clone https://github.com/basherpm/basher.git ~/.basher
$ export PATH="$HOME/.basher/bin:$PATH"
$ eval "$(basher init -)"
basher init usage has changed, please specify the name of your shell as an argument:

eval "$(basher init - bash)" # or zsh, fish, sh etc

For more information, check this PR: https://github.com/basherpm/basher/pull/77

初期化コマンドが変わったらしいので、やり直す。

$ eval "$(basher init - zsh)"
$ basher
Usage: basher <command> [<args>]

Some useful basher commands are:
   help        Display help for a command
   commands    List all available basher commands
   init        Configure the shell environment for basher

See 'basher help <command>' for information on a specific command.

$ basher commands
commands
completions
help
init
install
link
list
outdated
package-path
uninstall
upgrade

使ってみる

まずはシェルスクリプトモジュールをinstallし、includeでシェルに読み込むというのを試す。

# 自作のgcloud-promptをインストール
$ basher install progrhyme/gcloud-prompt
Cloning into '/home/progrhyme/.basher/cellar/packages/progrhyme/gcloud-prompt'...
: # 略
$ basher list
progrhyme/gcloud-prompt
$ include progrhyme/gcloud-prompt gcloud-prompt.sh
$ gcloud_prompt
default|my-project1,asia-northeast1

# kube-ps1をインストール
$ basher install jonmosco/kube-ps1
Cloning into '/home/progrhyme/.basher/cellar/packages/jonmosco/kube-ps1'...
: # 略
$ include jonmosco/kube-ps1 kube-ps1.sh
$ kube_ps1
(%{%F{4}%}⎈ %{%f%}|%{%F{1}%}reagent_experiment%{%f%}:%{%F{6}%}default%{%f%})
$ kubeoff
$ kube_ps1
$

次は実行ファイルを含むリポジトリをinstallしてみる。

$ basher install progrhyme/git-wraps
$ ll ~/.basher/cellar/bin/git-*
lrwxrwxrwx 1 progrhyme progrhyme 77  5月 19 20:55 /home/progrhyme/.basher/cellar/bin/git-branch-clean -> /home/progrhyme/.basher/cellar/package
s/progrhyme/git-wraps/bin/git-branch-clean
lrwxrwxrwx 1 progrhyme progrhyme 70  5月 19 20:55 /home/progrhyme/.basher/cellar/bin/git-pulls -> /home/progrhyme/.basher/cellar/packages/progr
hyme/git-wraps/bin/git-pulls
lrwxrwxrwx 1 progrhyme progrhyme 74  5月 19 20:55 /home/progrhyme/.basher/cellar/bin/git-pulls-all -> /home/progrhyme/.basher/cellar/packages/p
rogrhyme/git-wraps/bin/git-pulls-all
lrwxrwxrwx 1 progrhyme progrhyme 72  5月 19 20:55 /home/progrhyme/.basher/cellar/bin/git-skelton -> /home/progrhyme/.basher/cellar/packages/pro
grhyme/git-wraps/bin/git-skelton
lrwxrwxrwx 1 progrhyme progrhyme 83  5月 19 20:55 /home/progrhyme/.basher/cellar/bin/git-submodule-all-pull -> /home/progrhyme/.basher/cellar/p
ackages/progrhyme/git-wraps/bin/git-submodule-all-pull
lrwxrwxrwx 1 progrhyme progrhyme 81  5月 19 20:55 /home/progrhyme/.basher/cellar/bin/git-submodule-delete -> /home/progrhyme/.basher/cellar/pac
kages/progrhyme/git-wraps/bin/git-submodule-delete

$ basher list
jonmosco/kube-ps1
progrhyme/gcloud-prompt
progrhyme/git-wraps

ふつうに使えそう。
bin/* 以下のものはsymlinkなので、例えば実行ファイルが「同じリポジトリに含まれる lib/foo.sh に依存するシェルスクリプト」だとしても問題なく動くはず。

一応このケースも試しておく:

$ basher install progrhyme/shove
$ ~/.basher/cellar/bin/shove
Run tests by /bin/zsh
-------------------------

Test Summary Report
-------------------
All tests successful.
Files=0, Tests=0, Successes=0, Failures=0
Result: PASS

問題なし。

パッケージリストの管理ができるかどうか

Brewfileとかbundlerのようなことをやりたい。
clenvだと、 Clamfile っていうので管理できるようにしていた。

どうやらそれそのものの機能はないようだけど、ローカルのディレクトリをパッケージとしてインストールする link サブコマンドと、 package.sh に記した依存するパッケージを追加でインストールする、という機能によって、できなくはない、ということがわかった。

$ mkdir test-basher-package
$ cat <<EOS > test-basher-package/package.sh        
DEPS=progrhyme/shove:progrhyme/toolbox
EOS
$ basher link test-basher-package progrhyme/test-basher-package
Package 'progrhyme/shove' is already present
Cloning into '/home/progrhyme/.basher/cellar/packages/progrhyme/toolbox'...
: # 略

shoveはさっきインストールしたのでスキップされている。

このテスト用のパッケージをuninstallしても、依存パッケージは残ったまま。

$ basher uninstall progrhyme/test-basher-package
$ basher list
jonmosco/kube-ps1
progrhyme/gcloud-prompt
progrhyme/git-wraps
progrhyme/shove
progrhyme/toolbox

ちなみにこの basher link で実際に起こることしては ~/.basher/cellar/packages/ にsymlinkされるだけなので、処理としては軽い。

なので、例えば適当なディレクトリに package.sh を置いて、そこに DEPS で自分が使いたいパッケージのリストを記しておき、一時的にそのディレクトリを basher link でローカルインストールした後、削除する、ということをすれば、DEPSに記したパッケージリストをインストールできる。

…が、わざわざそんなことをするぐらいなら、パッケージリストを配列にでも入れてforループで処理してしまえば十分だと思った。

(追記)自分ではこんな感じで実装した。
後で、この basher_bundle_install を実行するだけのコマンド basher-bundle-install を作った。

Ubuntu Zshでbasherに乗り換えてみた

挙動を確認できたので、clenv -> basherへの移行を進めようかと思って、やってみた。

下のような形で対応できた。

一応他の環境には影響を与えないようにやったけど、他の環境でもすぐに乗り換えてしまおうと思っている。

追記: その後の対応