なまえは まだ ない

思いついたことをアウトプットします

Go 1.15 リリースを機にHomebrewと決別した話

2023/04/05 追記

Go 1.16 で go install が追加されたことで、Go 1.16以降では紹介しているスクリプトの内容に修正が必要でした。修正版を追加。

Homebrew のアップデート遅くない??

MacでGoを書いている方の大半はHomebrewでGoをインストールしているかと思います。 最近に限った話ではないと思いますが、GoのアップデートがリリースされてからHomebrewに降ってくるまでにめちゃくちゃ時間がかかるのです。 まずテストにめちゃくちゃ時間がかかる。12時間とか平気でかかる。で、当然のようにコケる。 先日Go 1.15がリリースされた時なんて、直前に1.14.7のアップデートが重なっていたこともあり散々だったようです。

Homebrewに頼らないアップデート方法を考える

僕はせっかちなのでリリースされたらすぐアップデートしたいわけです。 ただ、公式サイトからダウンロードしてチェックサムを確認して……というのはどうしても手作業になってしまってダルい。なんか良い方法は無いものかと。

Goの公式ツイッターを眺めていると、リリース時に↓のようなメッセージが流れてきます。

お、これを良い感じに使えば自動アップデートスクリプト書けるのでは?と思ったので書いてみました。

#!/bin/bash

if [ $# -ne 1 ]; then
    echo "upgrade-go <new_go_version>"
    exit 1
fi

NEW_GO="go${1}"
go install "golang.org/dl/${NEW_GO}@latest"
$NEW_GO download

NEW_GO_PATH=$(which "$NEW_GO")
ln -sF "$NEW_GO_PATH" /usr/local/bin/go

なお、 Go 1.15以前をお使いの方は(さすがにもういないと信じていますが、、) go install の代わりに go get を使用してください。

#!/bin/bash

if [ $# -ne 1 ]; then
    echo "upgrade-go <new_go_version>"
    exit 1
fi

NEW_GO="go${1}"
go get "golang.org/dl/${NEW_GO}"
$NEW_GO download

NEW_GO_PATH=$(which "$NEW_GO")
ln -sF "$NEW_GO_PATH" /usr/local/bin/go

このスクリプトupgrade-go という名前で適当なパスに格納しておきます。アップデートしたいときは↓のように新バージョンを渡して実行するだけです。

upgrade-go 1.15.1

スクリプトの中身を見ればすぐわかりますが、 go get をする都合上、最初にGoがインストールされていないといけません。

インストールしたGoのバイナリを /usr/local/bin/go としてシンボリックリンクを貼ります。これを一度流したらHomebrewでインストールしたGoはいらない子になるのでアンインストールしちゃいましょう。

注意点として、この方法でインストールするとGoのSDK${HOME}/sdk 配下に展開されます。Macを使うユーザーが自分だけなら良いですが、複数ユーザーが存在する場合影響あるかもしれません。

あと、過去にインストールしたバージョンのSDKとバイナリは変わらずローカルディスクに残り続けてしまいます。長く使ってると徐々にディスク容量を圧迫してしまうかも……?

まとめ

Homebrew に頼ることなく、ある程度簡単にGoをアップデートする方法を考えてみました。 前述の通りいくつか課題はあるので、気が向いたら改善していきます。