emahiro/b.log

日々の勉強の記録とか育児の記録とか。

localでのgoの管理においてbrewをやめた話

Overview

goのversionを複数使いたいケースにおいて brewを使ってしまうと常に最新のgoのversionになってしまいます。
複数versionを管理するために goenv もありますが、高々goのversion管理のためだけに新しいツールを入れたりすると無駄な依存を発生させてしまい、環境が壊れることもあります。 そこで最も簡単にgoのversionを複数管理するためには、そういったツールから脱却して直でGOROOTを書き換えながら対応するのが一番楽だと気づきました。

github.com

やりたいこと

  • 複数のgoのversionを扱いたい
  • goenvみたいな余計なツールを使わずにシンプルに管理したい
    • 余計なツールを入れると依存関係だったりversion違いで死ぬみたいなことが起こって原因特定しづらいから

手順

  • goをversionごとに管理する専用のディレクトリを作成する。
  • wgetでsrc(https://golang.org/dl/) からgoの欲しいversionをDownloadする。
    • macを使っている場合は goX.XX.darwin-amd64.tar.gz という darwin-amd64 とついているversionをDLしてきます。
  • 使いたいgoのversionをGOROOTに指定します。
  • 他のversionを使いたい時はshellの設定ファイル(zshrcやfish.config)でGOROOTを切り替えてpathを通し直せば簡単にversionを切りかえることは可能です。
$ wget https://dl.google.com/go/goX.XX.darwin-amd64.tar.gz
$ tar -C /usr/local -xzf goX.XX.darwin-amd64.tar.gz
# goというディレクトリ名になるのでversionがわかるように修正する
$ mv go goX.XX

ref: https://golang.org/doc/install#installLinux のタブ参照

fishでの管理の仕方

config.shのGOROOTの設定箇所は以下。

# go
set GOROOT_PATH $HOME/.goroots/goX.XX.X
set -x PATH $GOROOT_PATH/bin $PATH
set -x GOROOT $GOROOT_PATH
set -x GOPATH $HOME/.go
set -x PATH $GOPATH/bin $GOROOT/bin $PATH

これをそのまま反映することで使いたいGoのversionにpathが通ります。

cf. https://medium.com/@vCabbage/go-installing-multiple-go-versions-from-source-db5573067c