yeomanを入れて実行したところエラー
❯ yo code
must specify 3 arguments
確認したところspannerのgeneratorであるyoがすでに入っていました…
❯ yo help
yo is a command-line tool to generate Go code for Google Cloud Spanner.
(混乱を避けるため、以降ではコードブロック以外yoはspannerのコードジェネレートツールを指します)
両方利用したかったのでspanner generatorのyoを別名に書き換える方針で決めました。
その名もgoyoです(ババーン)
本題
ではどうやったらgo getで取得したコマンド名を変えられるのか?
go getのオプションを探しましたがありませんでした
そこで仕方なくyoの名前自体を変更します
yoはバイナリが入っていると思ったらシェルスクリプトでした
(goenvを使っているとそうなる?)
❯ file ~/.anyenv/envs/goenv/shims/yo
/Users/motoki.yoan/.anyenv/envs/goenv/shims/yo: Bourne-Again shell script text executable, ASCII text
❯ cat ~/.anyenv/envs/goenv/shims/yo
#!/usr/bin/env bash
set -e
[ -n "$GOENV_DEBUG" ] && set -x
program="${0##*/}"
if [[ "$program" = "go"* ]]; then
for arg; do
case "$arg" in
-c* | -- ) break ;;
*/* )
if [ -f "$arg" ]; then
export GOENV_FILE_ARG="$arg"
break
fi
;;
esac
done
fi
export GOENV_ROOT="/Users/me/.anyenv/envs/goenv"
exec "/Users/me/.anyenv/envs/goenv/libexec/goenv" exec "$program" "$@"
programがyoを表しているように見えますが、##*/が意味不明です
bashでの最長前方マッチを削除する処理を理解する
https://qiita.com/aosho235/items/c36568830a8d47288284
##はbashにおける変数文字列を置換する処理のようで、最長マッチを削除するらしいです。
つまり$0##*/なら、最後のスラッシュまで消してくれるので、basenameと同じ処理となります
ちなみに、basenameコマンドより置換のほうが高速なようです
https://qiita.com/rita_cano_bika/items/712807a5f79065aab7d2
今後はこっちを使っていきましょう。
書き換え
意味もわかったのでスクリプトを書き換えて、renameして完成です
下の行を書き換えます
program="${0##*/}"
program=`echo $program | sed 's/go//'`
renameします
mv yo goyo
無事書き換えられました
❯ yo --help
Usage: yo GENERATOR [args] [options]
...
❯ goyo help
yo is a command-line tool to generate Go code for Google Cloud Spanner.
...
もっといい方法あるのかなー