2019/11/28 このエントリーをはてなブックマークに追加 はてなブックマーク - JavaのカンファレンスなのにGoのお話をしてきました(JJUG CCC 2019 Fall) #jjug_ccc

JavaのカンファレンスなのにGoのお話をしてきました(JJUG CCC 2019 Fall) #jjug_ccc

カテゴリ: , , , ,

JJUG CCC 2019 Fall https://ccc2019fall.java-users.jp/ というJavaのカンファレンスで
Goの入門のお話をしました。
https://www.slideshare.net/yyyank/javago

Goを書いている人が読んでもおそらく新規性がない情報になっております。

2019/03/13 このエントリーをはてなブックマークに追加 はてなブックマーク - brew install go @ 1.10するとGOROOT指定しないとgo get出来ない!?

2018/10/07 このエントリーをはてなブックマークに追加 はてなブックマーク - ちょいとA Tour of Versioned Go (vgo)をやってみる

ちょいとA Tour of Versioned Go (vgo)をやってみる

カテゴリ:


これをやってみようかと。
A Tour of Versioned Go (vgo)
(Go & Versioning, Part 2)
https://research.swtch.com/vgo-tour

vgoの詳細は以下に委ねる。
Goにおけるバージョン管理の必要性 − vgoについて − by @tenntenn #golang #go https://www.slideshare.net/takuyaueda967/go-vgo-102442203



  • macOS High Sierra
  • Go 1.11.1

あぁ、なんかまだバグとかあるかもしれないとのこと。issue立ててとのこと。


You are certain to run into interesting bugs,
since vgo is at best only lightly tested right now. To file issues,
please use the main Go issue tracker and add the prefix “x/vgo:” to the title. 
Thanks.


とりあえず、素直にインストールしていきます。



go get -u golang.org/x/vgo

。。。なんだ?


go get -u golang.org/x/vgo
go get: warning: modules disabled by GO111MODULE=auto in GOPATH/src;
        ignoring go.mod;
        see 'go help modules'

なんかwaring出てるけど、一旦進めてみるか。




helloってディレクトリを作る



$ mkdir hello
$ cd hello



main関数書く



package main // import "github.com/you/hello"

import (
 "fmt"
 "rsc.io/quote"
)

func main() {
 fmt.Println(quote.Hello())
}

go.modってのを作ってビルドするらしい。

echo >go.mod
vgo build

果たしてすんなりビルド通るかな。
なんか、うちのネット環境が貧弱なせいもあって初回ビルドすんごい重いな。

$ vgo build
go: finding rsc.io/quote v1.5.2
go: downloading rsc.io/quote v1.5.2
go: finding rsc.io/sampler v1.3.0
go: finding golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
$ ./hello
こんにちは世界。

お、なんかすんなりできた。
ディレクトリ構成はこんな感じになった。

tree
.
├── go.mod
└── hello
    ├── go.mod
    ├── go.sum
    ├── hello
    └── hello.go

go.modの中身はこうなった。

cat hello/go.mod
module github.com/you/hello

require rsc.io/quote v1.5.2

go.sumの中身はこんな感じ。

cat hello/go.sum
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

どうやら、バージョンを固定するためのものっぽい。


vgoで管理しているものをupdate日付とか一覧で見るにはこんな感じらしい。

vgo list -m -u

実際にupgradeするにはこのようにする。

vgo get golang.org/x/text
vgo: finding golang.org/x/text v0.3.0
vgo: downloading golang.org/x/text v0.3.0

逆にダウングレードする際は、バージョン番号を指定してやると良いみたい。

$ vgo get rsc.io/sampler@v1.2.0

vgo test all でvgoで管理されているモジュールのテストが走るらしい。

vgo test all

結果:

vgo test all
ok      archive/zip     (cached)
ok      bufio   (cached)
ok      bytes   (cached)
ok      compress/bzip2  (cached)
ok      compress/flate  (cached)
ok      compress/gzip   (cached)
ok      compress/lzw    (cached)
ok      compress/zlib   (cached)
ok      container/list  (cached)
ok      context (cached)
ok      crypto  (cached)
ok      crypto/aes      (cached)
ok      crypto/cipher   (cached)
ok      crypto/des      (cached)
ok      crypto/dsa      (cached)
ok      crypto/ecdsa    (cached)
ok      crypto/elliptic (cached)
ok      crypto/hmac     (cached)
?       crypto/internal/randutil        [no test files]
ok      crypto/internal/subtle  (cached)
ok      crypto/md5      (cached)
ok      crypto/rand     (cached)
ok      crypto/rc4      (cached)
ok      crypto/rsa      (cached)
ok      crypto/sha1     (cached)
ok      crypto/sha256   (cached)
ok      crypto/sha512   (cached)
ok      crypto/subtle   (cached)
ok      crypto/tls      (cached)
ok      crypto/x509     (cached)
?       crypto/x509/pkix        [no test files]
?       encoding        [no test files]
ok      encoding/asn1   (cached)
ok      encoding/base64 (cached)
ok      encoding/binary (cached)
ok      encoding/gob    (cached)
ok      encoding/hex    (cached)
ok      encoding/json   (cached)
ok      encoding/pem    (cached)
ok      encoding/xml    (cached)
ok      errors  (cached)
ok      flag    (cached)
ok      fmt     (cached)
?       github.com/you/hello    [no test files]
ok      go/ast  (cached)
ok      go/build        (cached)
ok      go/doc  (cached)
ok      go/format       (cached)
ok      go/parser       (cached)
ok      go/printer      (cached)
ok      go/scanner      (cached)
ok      go/token        (cached)
?       golang.org/x/text/internal/gen  [no test files]
ok      golang.org/x/text/internal/tag  (cached)
?       golang.org/x/text/internal/testtext     [no test files]
ok      golang.org/x/text/internal/ucd  (cached)
ok      golang.org/x/text/language      (cached)
ok      golang.org/x/text/unicode/cldr  (cached)
ok      golang_org/x/crypto/chacha20poly1305    (cached)
ok      golang_org/x/crypto/cryptobyte  (cached)
?       golang_org/x/crypto/cryptobyte/asn1     [no test files]
ok      golang_org/x/crypto/curve25519  (cached)
ok      golang_org/x/crypto/internal/chacha20   (cached)
ok      golang_org/x/crypto/poly1305    (cached)
ok      golang_org/x/net/dns/dnsmessage (cached)
ok      golang_org/x/net/http/httpguts  (cached)
ok      golang_org/x/net/http/httpproxy (cached)
ok      golang_org/x/net/http2/hpack    (cached)
ok      golang_org/x/net/idna   (cached)
?       golang_org/x/net/internal/nettest       [no test files]
ok      golang_org/x/net/nettest        (cached)
ok      golang_org/x/net/route  (cached)
?       golang_org/x/text/secure/bidirule       [no test files]
ok      golang_org/x/text/transform     (cached)
?       golang_org/x/text/unicode/bidi  [no test files]
ok      golang_org/x/text/unicode/norm  (cached)
ok      hash    (cached)
ok      hash/adler32    (cached)
ok      hash/crc32      (cached)
ok      hash/crc64      (cached)
ok      hash/fnv        (cached)
ok      image   (cached)
ok      image/color     (cached)
?       image/color/palette     [no test files]
ok      image/draw      (cached)
ok      image/gif       (cached)
?       image/internal/imageutil        [no test files]
ok      image/jpeg      (cached)
ok      image/png       (cached)
?       internal/bytealg        [no test files]
ok      internal/cpu    (cached)
?       internal/nettrace       [no test files]
ok      internal/poll   (cached)
?       internal/race   [no test files]
ok      internal/singleflight   (cached)
?       internal/syscall/unix   [no test files]
?       internal/testenv        [no test files]
?       internal/testlog        [no test files]
ok      internal/trace  (cached)
ok      io      (cached)
ok      io/ioutil       (cached)
ok      log     (cached)
ok      math    (cached)
ok      math/big        (cached)
ok      math/bits       (cached)
ok      math/cmplx      (cached)
ok      math/rand       (cached)
ok      mime    (cached)
ok      mime/multipart  (cached)
ok      mime/quotedprintable    (cached)
# os/signal.test
clang: warning: argument unused during compilation: '-nopie' [-Wunused-command-line-argument]
ok      net     477.127s
ok      net/http        (cached)
ok      net/http/cookiejar      (cached)
ok      net/http/httptest       (cached)
ok      net/http/httptrace      (cached)
ok      net/http/httputil       (cached)
ok      net/http/internal       (cached)
ok      net/internal/socktest   (cached)
ok      net/mail        (cached)
ok      net/textproto   (cached)
ok      net/url (cached)
ok      os      18.478s
ok      os/exec (cached)
ok      os/signal       (cached)
?       os/signal/internal/pty  [no test files]
ok      os/user (cached)
ok      path    (cached)
ok      path/filepath   (cached)
ok      reflect (cached)
ok      regexp  (cached)
ok      regexp/syntax   (cached)
--- FAIL: TestHello (0.00s)
    quote_test.go:19: Hello() = "99 bottles of beer on the wall, 99 bottles of beer, ...", want "Hello, world."
FAIL
FAIL    rsc.io/quote    0.008s
--- FAIL: TestHello (0.00s)
    hello_test.go:31: Hello([en-US fr]) = "99 bottles of beer on the wall, 99 bottles of beer, ...", want "Hello, world."
    hello_test.go:31: Hello([fr en-US]) = "99 bottles of beer on the wall, 99 bottles of beer, ...", want "Bonjour le monde."
FAIL
FAIL    rsc.io/sampler  0.008s
ok      runtime (cached)
ok      runtime/debug   (cached)
ok      runtime/internal/atomic (cached)
ok      runtime/internal/sys    (cached)
ok      runtime/trace   (cached)
ok      sort    (cached)
ok      strconv (cached)
ok      strings (cached)
ok      sync    (cached)
ok      sync/atomic     (cached)
ok      syscall (cached)
ok      testing (cached)
?       testing/iotest  [no test files]
ok      testing/quick   (cached)
ok      text/tabwriter  (cached)
ok      text/template   (cached)
ok      text/template/parse     (cached)
ok      time    (cached)
ok      unicode (cached)
ok      unicode/utf16   (cached)
ok      unicode/utf8    (cached)
?       unsafe  [no test files]

あ、失敗してるし。


どうやら、1.99.99だとテストFAILするので、バージョン変更しようっていうサンプルっぽいですね。
流れにしたがって、 vgo get rsc.io/sampler@v1.3.1 すると テストをPASSするようになりました。


特定のバージョンを除外することもできる。
こんな感じで。

echo 'exclude rsc.io/sampler v1.99.99' >>go.mod

go.modの除外は、他のモジュールでは有効にならない。
この場合、hello/go.modにのみ除外が有効で、他のモジュールでhelloモジュールが使われていたとしても exclude ... は適用されないということみたい。


特定のモジュールを指定して、置き換えができるということらしい。

ローカルにあるソースを参照させるようにしたり

echo 'replace rsc.io/quote v1.5.2 => ../quote' >>go.mod

forkしてきたものを見るようにしたり出来るみたい。

echo 'replace rsc.io/quote v1.5.2 => github.com/you/quote v0.0.0-myfork' >>go.mod

ベンダリングして、GOPATHの通っているところにもっていけば go buildも出来るということらしい。

vgo vendor
$ mkdir -p $GOPATH/src/github.com/you
$ cp -a . $GOPATH/src/github.com/you/hello
$ go build -o vhello github.com/you/hello
$ LANG=es ./vhello
Puedo comer vidrio, no me hace daño.

先ほどの資料によると(https://www.slideshare.net/takuyaueda967/go-vgo-102442203)、
これが Go 1.12では標準となるということですが、
まぁ、普通に使ってみて使えるっちゃ使えるかもなぁと思います(正直ちょっと触ったぐらいではツラミ分からない)。

いちど、ビルド・デプロイの流れを組んでしまえば (それなりに大変だろうけど)なんとかなりそうな。
でも、depとかgbとかもアクティブなのだろうし、他のツールを使っているならそのまま使っていても良いような。
モジュール単位でのバージョン管理とかvgoの仕組みにメリットがあれば使っていけば良い…のかな?




GA