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" "$@"

programyoを表しているように見えますが、##*/が意味不明です

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.
...

もっといい方法あるのかなー