Ubuntuでsnapを使って最新バージョンのgoをインストール
結論
私が今後あちこちの環境でインストールすることになるので結論を先にメモしておきます。
Ubuntuでsnapを使ってgo 1.10.xの最新版をインストールするには以下のコマンドを実行すればOKです。
$ sudo snap install --channel=1.10/stable --classic go
背景
Ubuntu 18.04をリリースしてすぐに試してみたところ、aptでgoの1.10.1がインストールできました。その後 2018-05-01 に 1.10.2 がリリースされました (Release History - The Go Programming Language 参照)が、2018-05-16時点ではaptでインストールできるdebパッケージは1.10.1のままでした。
$ apt show golang-1.10 | head -10
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
Package: golang-1.10
Version: 1.10.1-1ubuntu2
Priority: optional
Section: devel
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Go Compiler Team <pkg-golang-devel@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 86.0 kB
Depends: golang-1.10-doc (>= 1.10.1-1ubuntu2), golang-1.10-go (>= 1.10.1-1ubuntu2), golang-1.10-src (>= 1.10.1-1ubuntu2)
一方、snap (Snapcraft - Snaps are universal Linux packages ) ではチャンネルを選択することで1.10.2がインストール可能でした。ということで手順をメモしておきます。
snapでgoの最新版をインストール
チャンネルごとのバージョン確認
snapのパッケージは複数のチャンネルを持つことができ、安定版とベータ版を両方インストールしておいて切り替えて使うことができるようです。 Channels - Snaps are universal Linux packages を参照してください。
まずgoパッケージの情報を表示してチャンネル毎のバージョンを確認します。
$ snap info go
name: go
summary: Go programming language compiler, linker, stdlib
publisher: mwhudson
contact: michael.hudson@ubuntu.com
license: BSD-3-Clause
description: |
This snap provides an assembler, compiler, linker, and compiled libraries for the Go programming
language.
snap-id: Md1HBASHzP4i0bniScAjXGnOII9cEK6e
channels:
stable: 1.10.1 (1688) 66MB classic
candidate: ↑
beta: ↑
edge: devel-5cf3e34 (1904) 77MB classic
1.10/stable: 1.10.2 (1880) 66MB classic
1.10/candidate: ↑
1.10/beta: ↑
1.10/edge: ↑
1.6/stable: 1.6.4 (122) 49MB classic
1.6/candidate: ↑
1.6/beta: ↑
1.6/edge: ↑
1.7/stable: 1.7.6 (324) 48MB classic
1.7/candidate: ↑
1.7/beta: ↑
1.7/edge: ↑
1.8/stable: 1.8.7 (1407) 51MB classic
1.8/candidate: ↑
1.8/beta: ↑
1.8/edge: ↑
1.9/stable: 1.9.6 (1873) 58MB classic
1.9/candidate: ↑
1.9/beta: ↑
1.9/edge: ↑
デフォルトのstableチャンネルではgoのバージョンは1.10.1ですが、1.10/stableチャンネルなら1.10.2であることがわかります。
(参考) snapのconfinementについて
1.10/stableチャンネルを指定してgoをインストールしようとすると、以下のエラーが出ました。
$ sudo snap install --channel=1.10/stable go
error: This revision of snap "go" was published using classic confinement and thus may perform
arbitrary system changes outside of the security sandbox that snaps are usually confined to,
which may put your system at risk.
If you understand and want to proceed repeat the command including --classic.
classic confinementというのは何だろうと思って検索すると How to snap: introducing classic confinement | Ubuntu Insights とそこからリンクされている Confinement - Snaps are universal Linux packages に説明がありました。
confinementの意味・用例|英辞郎 on the WEB:アルク によるとconfiementは「監禁」や「閉じ込め」という意味です。
snapのパッケージのconfinementはデフォルトではstrictというのになっていて、パッケージが依存するライブラリはすべてバンドルし、パッケージが読み書き可能なディレクトリはsnap用の特定のディレクトリに限定されるようになっているそうです。
一方classic confinementでは従来のdebパッケージのようにシステム全体にフルアクセスが可能とのことです。
go 1.10.xの最新版1.10.2をインストール
snap install
のオプションを確認します。
$ snap install --help
Usage:
snap [OPTIONS] install [install-OPTIONS] <snap>...
The install command installs the named snap in the system.
Application Options:
--version Print the version and exit
Help Options:
-h, --help Show this help message
[install command options]
--channel= Use this channel instead of stable
--edge Install from the edge channel
--beta Install from the beta channel
--candidate Install from the candidate channel
--stable Install from the stable channel
--devmode Put snap in development mode and disable security confinement
--jailmode Put snap in enforced confinement mode
--classic Put snap in classic mode and disable security confinement
--revision= Install the given revision of a snap, to which you must have developer access
--dangerous Install the given snap file even if there are no pre-acknowledged signatures for it, meaning it was not verified and
could be dangerous (--devmode implies this)
--unaliased Install the given snap without enabling its automatic aliases
以下のコマンドで1.10.xの最新版をインストールします。
sudo snap install --channel=1.10/stable --classic go
インストールしたgoのパスとバージョンを確認すると以下のようになっていました。
$ which go
/snap/bin/go
$ go version
go version go1.10.2 linux/amd64
(参考) インストール後のチャンネル切り替えはsnap refreshで
最初に試したときはまず以下のコマンドで stable チャンネルのgo 1.10.1をインストールしていました。
sudo snap install --classic go
goのパスとバージョンは以下のとおりです。
ちなみに、aptでもgolangをインストールしているとそちらが優先されます。 PATH
環境変数を確認すると /usr/bin
が /snap/bin
よりも先に指定されていました。
$ which go
/snap/bin/go
$ go version
go version go1.10.1 linux/amd64
この状態で 1.10/stable
チャンネルのgoをインストールしようとして以下のコマンドを試してみるとすでにインストール済みなので snap refresh を使うように言われました。
$ sudo snap install --classic --channel=1.10/stable go
snap "go" is already installed, see "snap refresh --help"
以下のようにすればインストールして切り替えできました。
sudo snap refresh --classic --channel=1.10/stable go
.. code-block:: console
$ which go
/snap/bin/go
$ go version
go version go1.10.2 linux/amd64
godocは別途インストールが必要
godocを使おうとしたら以下のエラーになり golang-golang-x-tools
パッケージをインストールすれば使えるとのことでした。
$ godoc -http=:6060
The program 'godoc' is currently not installed. You can install it by typing:
sudo apt install golang-golang-x-tools
2018-05-06時点では golang-golang-x-tools
パッケージのバージョンは以下のように 2016-03-15時点の
go/gcimporter15: require go1.6 for binary import/export (fix build) · golang/tools@f42ec61
のコミットに対応したものになっていました。
$ sudo apt show golang-golang-x-tools | grep ^Version:
Version: 1:0.0~git20160315.0.f42ec61-2
これより新しい版を使いたい場合は golang/tools: [mirror] Go Tools にあるように go get
でインストールするのが手軽そうです。
go get -u golang.org/x/tools/...