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の公式ツイッターを眺めていると、リリース時に↓のようなメッセージが流れてきます。
🙌 Go 1.15 is released!
— Go (@golang) 2020年8月11日
📝 Release notes: https://t.co/8rSjmls8sX
📦 Download: https://t.co/TmShCdDqns#golang pic.twitter.com/n96fDt66ip
お、これを良い感じに使えば自動アップデートスクリプト書けるのでは?と思ったので書いてみました。
#!/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をアップデートする方法を考えてみました。 前述の通りいくつか課題はあるので、気が向いたら改善していきます。