- ã¯ããã«
- go.modã«ãããGoã®ãã¼ã¸ã§ã³æå®
- 1.21以éã®go.modã«ãããGoã®ãã¼ã¸ã§ã³æå®
- requireæã®ãã¼ã¸ã§ã³ã®æå®
- Minimal version selection
- ã¢ã¸ã¥ã¼ã«ã®ãã¼ã¸ã§ã³
- replaceã®æ³¢åå
- go.sum
- ã¾ã¨ã
ã¯ããã«
ãããã¯ãããããå·¥æ¿ã¢ããã³ãã«ã¬ã³ãã¼ 2021 11æ¥ç®ã®è¨äºã§ãã
ããã¨ã ãæ¸ãã¦ãããæ°åãæããªã£ãã®ã§ãæ¶ãã¦èªåã®éå»ã®ã¡ã¢ãè¨äºã«ãããã¨ã«ãã¾ããããããªè§£éãããã¤ããã¸ãããwwã¨æ¯éç¬ã£ã¦èªãã§ãã ããã
ã2023-09-19追è¨ï¼Go 1.21ããããã¤ãæåã«å¤æ´ãå ¥ã£ãã®ã§å çãã¦ãã¾ããããã¾ã§ã®å 容ã«ã¯è§¦ãããã®ã¾ã¾ã«ã1.21以éã«ãããæåã追è¨ãã¦ããã®ã§ã注æãã ããã
go.modã«ãããGoã®ãã¼ã¸ã§ã³æå®
注æï¼ãã®ç¯ã§ã¯Go 1.21æªæºã«ãããæåã«ã¤ãã¦è§£èª¬ãã¾ãã1.21以éã§ã¯ç°ãªãæåã«ãªãã¾ã
go.modã«ã¯ go 1.17
ã®ããã«ãGoã®ãã¼ã¸ã§ã³ãæå®ãããã£ã¬ã¯ãã£ããããã¾ãã
- é¥ãããã誤解ï¼æå®ãããã¼ã¸ã§ã³ã§ã®ã¿ãã«ãããã
- å®éã®æåï¼æå®ãããã¼ã¸ã§ã³ã¾ã§ã®è¨èªæ©è½ã®ã¿ãå©ç¨ã§ããã
https://golang.org/ref/mod#go-mod-file-go
the go directive still affects use of new language features
go 1.15
ã¨æ¸ããå ´åã«ã§ãGo 1.17ã§ãã«ããããã¨ã¯åºæ¥ã¾ãããã ãGo 1.17ã1.16ã§å
¥ã£ãæ°ããè¨èªæ©è½ã使ããã¨ã¯åºæ¥ã¾ãããä¸ã®ãã¼ã¸ã«ãä¸è¨ã®æ§ãªä¾ãæ²è¼ããã¦ãã¾ãã
For example, if a module has the directive go 1.12, its packages may not use numeric literals like 1_000_000, which were introduced in Go 1.13.
ä¾åå ã®goãã£ã¬ã¯ãã£ãã®æ¹ãå¤ããã¼ã¸ã§ã³ãæãå ´å
以ä¸ã®Goã使ã£ã¦ãã«ããã¾ãã
⯠go version go version go1.17.5 darwin/arm64
ãããªæãã§ãã¡ã¤ã«ãç¨æãã¾ããã
. âââ A â  âââ go.mod â  âââ hello.go âââ B â  âââ go.mod â  âââ hello.go âââ go.mod âââ main.go
ã«ã¼ãç´ä¸ã®go.modã§Aã»Bãããããrequire && replaceãã¦ãã¾ã
module main-module go 1.17 require ( A v0.0.0 B v0.0.0 ) replace A => ./A replace B => ./B
åã¢ã¸ã¥ã¼ã«Aã»Bã¯Hello
ã¨ããé¢æ°ãæã£ã¦ãããèªèº«ã®ã¢ã¸ã¥ã¼ã«åãããã¹ãã¾ãï¼âã¯ã¢ã¸ã¥ã¼ã«Aã®å ´åï¼ã
package A import "fmt" func Hello() { fmt.Println("This is module A.") }
ã«ã¼ãç´ä¸ã®main.goã§ãããã®é¢æ°ãå¼ã³ã¾ãã
package main import ( "A" "B" ) func main() { A.Hello() B.Hello() }
ãã ããgo.modã§æå®ããgoãã£ã¬ã¯ãã£ãããããã以ä¸ã®æ§ã«è¨å®ãã¾ãã
- ã¢ã¸ã¥ã¼ã«Aï¼
go 1.17
- ã¢ã¸ã¥ã¼ã«Bï¼
go 1.12
- ã«ã¼ãç´ä¸ã®go.modï¼
go 1.17
--- A/go.mod 2021-12-11 09:35:59.000000000 +0900 +++ B/go.mod 2021-12-11 09:36:05.000000000 +0900 @@ -1,3 +1,3 @@ -module A +module B -go 1.17 +go 1.12
ãã®ç¶æ ã§go run main.goããã¨ãæ£ãããã«ãããå®è¡ã§ãã¾ãã
⯠go run ./main.go This is module A. This is module B.
ã¾ããgo 1.17
ãæå®ãã¦ããã¢ã¸ã¥ã¼ã«Aãmainã¢ã¸ã¥ã¼ã«ã§ã¯ãGo 1.17ã¾ã§ã®è¨èªæ©è½ãå
¨ã¦ä½¿ããã¨ãåºæ¥ã¾ãããã ãmodule Bå
ã§Go 1.12ãããæ°ããè¨èªæ©è½ã使ããã¨ã¯åºæ¥ã¾ãããããã§ã¯ãªãã¡ã¬ã³ã¹ã«æ²è¼ããã¦ããä¾ã«ãªããã1_000_000
ã¨ãããªãã©ã«ã使ã£ã¦ã¿ããã¨ã«ãã¾ãã
package B import "fmt" func Hello() { fmt.Println("This is module B.") // Go 1.13以ä¸ã§ãã使ããªããªãã©ã« fmt.Println(1_000_000) }
⯠go run ./main.go # B B/hello.go:8:17: underscores in numeric literals requires go1.13 or later (-lang was set to go1.12; check go.mod)
ä¾åå ã®goãã£ã¬ã¯ãã£ãã®æ¹ãæ°ãããã¼ã¸ã§ã³ãæãå ´å
ä¾ãã°ä»¥ä¸ã®æ§ãªå ´åã§ãã
- ã¢ã¸ã¥ã¼ã«Aï¼
go 1.17
- ã¢ã¸ã¥ã¼ã«Bï¼
go 1.12
- ã«ã¼ãç´ä¸ã®go.modï¼
go 1.12
æ®éã«ãã«ãã»å®è¡ãã§ãã¾ãã
⯠go run ./main.go This is module A. This is module B.
ããã§ãã¢ã¸ã¥ã¼ã«Aã§Go 1.12ã§ã¯ä½¿ããªãæ©è½ã使ã£ã¦ã¿ã¾ãã
package A import "fmt" func Hello() { fmt.Println("This is module A.") fmt.Println(1_000_000) }
ãããã¾ããã«ãã»å®è¡ãããã¨ãã§ãã¾ãã
⯠go run ./main.go This is module A. 1000000 This is module B.
ãã ããmain.goã®ä¸ã§Go 1.12ãããæ°ããæ©è½ãç´æ¥ä½¿ããã¨ã¯åºæ¥ã¾ããã
package main import ( "A" "B" "fmt" ) func main() { A.Hello() B.Hello() // ããã足ã fmt.Println(1_000_000) }
⯠go run ./main.go # command-line-arguments ./main.go:13:17: underscores in numeric literals requires go1.13 or later (-lang was set to go1.12; check go.mod)
goã®ãã¼ã¸ã§ã³ããgoãã£ã¬ã¯ãã£ããå è¡ããå ´å
ããã¾ã§ã¯å ¨ã¦Go 1.17.5ã§ãã«ããã¦ãã¾ãããã試ãã«Go 1.16ãããã§ãã«ããã¦ã¿ã¾ãã
⯠go version go version go1.16.12 darwin/arm64
- ã¢ã¸ã¥ã¼ã«Aï¼
go 1.17
- ã¢ã¸ã¥ã¼ã«Bï¼
go 1.12
- ã«ã¼ãç´ä¸ã®go.modï¼
go 1.17
ãæå®ãã¦ãã¦ãã¤Go 1.17以éã§ã®ã¿ä½¿ãããããªæ©è½ãå«ã¾ãªãå ´åã
⯠go run ./main.go This is module A. This is module B.
ãã®ã¨ãGo 1.17ã§ãã使ããªããããªæ©è½ã使ãã¨ãã«ãã«å¤±æãã¾ããä¾ãã°Go1.17ã§math
ã¢ã¸ã¥ã¼ã«ã«è¿½å ããã MaxInt
ãåç
§ããã¨ã¨ã©ã¼ã«ãªãã¾ãã
⯠go run ./main.go # command-line-arguments ./main.go:13:17: undefined: math.MaxInt note: module requires Go 1.17
goãã£ã¬ã¯ãã£ãã¾ã¨ã
- ããã¢ã¸ã¥ã¼ã«å ã§ã¯goãã£ã¬ã¯ãã£ãã§æå®ãããã¼ã¸ã§ã³ã¾ã§ã®è¨èªæ©è½ã使ããã
- èªèº«ããå
è¡ããgoãã£ã¬ã¯ãã£ããæå®ããã¢ã¸ã¥ã¼ã«ã使ããï¼1.21æªæºã®å ´åï¼
- ãã ãæåã®å¶ç´ã«ãããèªèº«ã®ä¸ã§ã¯èªèº«ã®æå®ãããã¼ã¸ã§ã³ã¾ã§ã®æ©è½ãã使ããªãã
- èªèº«ããå°ãããã¼ã¸ã§ã³ãæå®ããã¢ã¸ã¥ã¼ã«ã使ããã
- ãã ãæåã®å¶ç´ã«ããããã®ã¢ã¸ã¥ã¼ã«ã®ä¸ã§ã¯ãã®ã¢ã¸ã¥ã¼ã«ã®æå®ãããã¼ã¸ã§ã³ã¾ã§ã®æ©è½ãã使ããªãã
- goãã¼ã¸ã§ã³ããgoãã£ã¬ã¯ãã£ããå è¡ãã¦ãã¦ãããã®goãã¼ã¸ã§ã³ã¾ã§ã§ä½¿ç¨ã§ããæ©è½ã ãã§æ§æããã¦ããã°ãã«ãã§ããã
å®éã«ã¯ãã£ã¨ç´°ããéããªã©ãããã¯ããªã®ã§ããã以ä¸ã¯å ¬å¼ã®ãªãã¡ã¬ã³ã¹ãèªã¿ã¾ãããã
https://go.dev/ref/mod#go-mod-file-go
1.21以éã®go.modã«ãããGoã®ãã¼ã¸ã§ã³æå®
Go 1.21ã®ãªãªã¼ã¹ãã¼ãã§è¨åããã¦ãã¾ãããæåã以ä¸ã®æ§ã«å¤æ´ããã¦ãã¾ãã
- é¥ãããã誤解ï¼æå®ãããã¼ã¸ã§ã³ã§ã®ã¿ãã«ãããã
- å®éã®æåï¼æå®ãããã¼ã¸ã§ã³ä»¥éã§ã®ã¿ãã«ãå¯è½
Go 1.21 Release Notes - The Go Programming Language
Go 1.21 now reads the go line in a go.work or go.mod file as a strict minimum requirement: go 1.21.0 means that the workspace or module cannot be used with Go 1.20 or with Go 1.21rc1.
ããã¯Go 1.21以éã®ã¿ã«é©ç¨ããããããä¾ãã° go 1.21
ã¨æ¸ãããï¼ãã ãgo 1.21ã®æ°æ©è½ãå«ã¾ãªãï¼goã¢ã¸ã¥ã¼ã«ãgo 1.20.xã§ãã«ããããã¨ã¯å¯è½ã§ãã
requireæã®ãã¼ã¸ã§ã³ã®æå®
require
ãã£ã¬ã¯ãã£ãã§ãã¼ã¸ã§ã³ãæå®ã§ãã¾ããgo get ã¢ã¸ã¥ã¼ã«ãã¹@ãã¼ã¸ã§ã³
ãªã©ã¨ããã¨æå®ã®ãã¼ã¸ã§ã³ã«åºå®ã§ãã¾ãã
- é¥ãããã誤解ï¼ãã®ã¢ã¸ã¥ã¼ã«ã¯ãã®ãã¼ã¸ã§ã³ä»¥å¤ã¯è¨±å®¹ããªãã
- å®éã®æåï¼ãã®ãã¼ã¸ã§ã³ä»¥ä¸ã次ã®ã¡ã¸ã£ã¼ãã¼ã¸ã§ã³æªæºã許容ããã
ä¾ãã° require A v1.0.0
ã¨ããã¨ããã®Aã®åãå¾ããã¼ã¸ã§ã³ã®ç¯å²ã¯v1.0.0ããv2.0.0æªæºã¨ãªãã¾ãããã ãåæã«å¤ããããã§ã¯ãªããä»ã®ä¾åå
ãä»ã®Aã®ãã¼ã¸ã§ã³ã«ä¾åãã¦ããããã§ãªããªãv1.0.0ãå©ç¨ããã¾ãã詳ããã¯æ¬¡ç¯ã§èª¬æãã¾ãã
ãã®æåã¯åãã¡ã¸ã£ã¼ãã¼ã¸ã§ã³ã®éã§å®å ¨ãªå¾æ¹äºææ§ãä¿ããããã¨ãåæã¨ãªã£ã¦ãã¾ããèªèº«ã§ã¢ã¸ã¥ã¼ã«ãä½ãæã¯ããã®ç¹ã«ååé æ ®ããå¿ è¦ãããã¾ãã
Minimal version selection
Goãã¢ã¸ã¥ã¼ã«ã®ãã¼ã¸ã§ã³ãé¸æããéã®ã¢ã«ã´ãªãºã ã§ãã
- é¥ãããã誤解ï¼ãã®ã¢ã¸ã¥ã¼ã«ã®ä¸çªå°ãããã¼ã¸ã§ã³ã使ã*1
- å®éã®æåï¼ä¾åãå ¨é¨èæ ®ããã¨ãã«è¦ä»¶ãæºããæå°ãã¼ã¸ã§ã³ãé¸ã¶
以ä¸ã«å ¬å¼ã®ä»æ§ãããã¾ãã
https://golang.org/ref/mod#minimal-version-selection
ã¤ã¾ããããã¢ã¸ã¥ã¼ã«Aã«ã¤ãã¦ã¢ã¸ã¥ã¼ã«Bã«ã¯ require A v1.1.0
ãã¢ã¸ã¥ã¼ã«Cã«ã¯ require A v1.3.0
ã¨ããå¶ç´ããã£ãã¨ããBã¨Cãåæã«å©ç¨ãAã®ãã¼ã¸ã§ã³ãæ示ããªãå ´åã¯v1.3.0ãå©ç¨ããã¾ããã¾ããBã¨Cãåæã«å©ç¨ããã¤require A v1.1.0
ãªã©ã¨ããä½ããã¼ã¸ã§ã³ãæ示ãã¦ããv1.3.0ãå©ç¨ããã¾ãã
ãã¼ã¸ã§ã³ãå®å
¨ã«åºå®ãããå ´å㯠replace
ãå©ç¨ãããã¨ã«ãªãã¾ããä¾ãã°v1.1.0 ã«å¼·å¶çã«åºå®ãããå ´å㯠replace A => A v1.1.0
ã¨ãã¾ããããã¯å©ç¨ããã¢ã¸ã¥ã¼ã«å
¨ã¦ã«å½±é¿ããå¼·å¶çã«v1.1.0ã使ããã¨ã«ãªãã¾ã*2ã
v2ãªã©ã¡ã¸ã£ã¼ãã¼ã¸ã§ã³ãå¤ããå ´åã¯ã¤ã³ãã¼ãããã¢ã¸ã¥ã¼ã«ãã¹ãç°ãªããã¨ããå¶ç´ããããããåæã«requireã«æå®ãã¦ä½¿ããã¨ãåºæ¥ãã¯ãã§ã*3ã
ã¢ã¸ã¥ã¼ã«ã®ãã¼ã¸ã§ã³
- é¥ãããã誤解ï¼ã»ãã³ãã£ãã¯ãã¼ã¸ã§ãã³ã°ã«å¾ãã¿ã°ã§ããæå®ã§ããªã
- å®éã®æåï¼ç¹å®ã®ã³ãããããã·ã¥ãæããã¨ãã§ãã
go.modã®ä»æ§ã«ã¯çä¼¼ãã¼ã¸ã§ã³ï¼Pseudo versionï¼ã¨ãããã®ãè¨è¼ããã¦ãã¾ãã
https://go.dev/ref/mod#pseudo-versions
ããã¯ç¹å®ã®ã³ãããããã·ã¥ããã»ãã³ãã£ãã¯ãã¼ã¸ã§ã³ã«å¯¾å¿ãããã¼ã¸ã§ã³æååã«å¤æããããã®ä»æ§ã§ããä¾ãã° v0.0.0-20191109021931-daa7c04131f5
ã®ãããªãã®ã§ããã¤ã¾ã
<æ¢ã«ãããã¼ã¸ã§ã³+1>-<commitã®æ¥æ>-<12æ¡ã®ã³ãããããã·ã¥>
ã¨ãããã¼ã¸ã§ã³ãæ§æããã¾ããæ¢ã«ãããã¼ã¸ã§ã³+1
ã¨ã¯ãvX.Y.Z
ãæ¢ã«ããæãã¦ããã³ãããããã·ã¥ããããããæ°ããå ´åãvX.Y.Z+1
ã«ãªãã¨ããæå³ã§ããããã§ãã¼ã¸ã§ã³ãã¾ã ä¸ã¤ãä»ãããã¦ããªãå ´åã« v0.0.0
ãæ¡ç¨ããã¾ãã
golang.org/x/*
ãªã©ã«ã¯ãã®ãã¼ã¸ã§ãã³ã°ãæ¡ç¨ãã¦ãããã®ãè¤æ°æãã¾ã*4ãä¾ãã° golang/x/net
ã®ãªãã¸ããªï¼ãã©ã¼ã§ããï¼ãè¦ãã¨ã¿ã°ãä¸ã¤ãä»ãã¦ããªããã¨ããããã¾ãã
ãããå©ç¨ããã¨ãvendoringã¯ãããã®ã®glideãdepã«è§¦ãããã¨ãªãä»ã«è³ãå¤ã®Goãããã¯ãããç ´å£çãªãã¨ãããã«go modulesã«å¯¾å¿ããããã¨ãã§ãã¾ã*5ããã ãvendoringããã¨ãã®ã³ããããªãããã¼ã¸ã§ã³ãããã£ã¦ãããã¨ãåæã«ãªãã¾ãã
replaceã®æ³¢åå
- é¥ãããã誤解ï¼replaceãã£ã¬ã¯ãã£ãã¯å¸¸ã«æå¹
- å®éã®æåï¼replaceãã£ã¬ã¯ãã£ãã¯ãmain moduleã«æ¸ããããã®ã®ã¿ãæå¹ã
ããã¢ã¸ã¥ã¼ã«Aå ã®mainããã±ã¼ã¸ããã«ãããã¨ãã¾ããããã§ãã¢ã¸ã¥ã¼ã«Aã¯å¥ã®ã¢ã¸ã¥ã¼ã«Bã«ä¾åãã¦ããã¨ãã¾ãããã®ã¨ããã¢ã¸ã¥ã¼ã«Bã®go.modã«è¨è¿°ãããreplaceã¯ç¡è¦ããã¾ãã
https://go.dev/ref/mod#go-mod-file-replace
replace directives only apply in the main moduleâs go.mod file and are ignored in other modules. See Minimal version selection for details.
ä¾åå ãå¥ã®ãã¹ã«replaceãã¦ããå ´å
ä¾åå ã§ã®ãã¼ã¸ã§ã³ã®replaceã¯åã«ç¡è¦ããã¦ãã«ãããã¾ãããã¢ã¸ã¥ã¼ã«ãã¹ãæ¸ãæãã¦ãã¾ã£ã¦ããå ´åã«ã©ããªãããã£ã¦ã¿ã¾ãã
. âââ A â  âââ go.mod â  âââ hello.go âââ B â  âââ go.mod â  âââ hello.go âââ go.mod âââ main.go
ã¢ã¸ã¥ã¼ã«Aã¯ã¢ã¸ã¥ã¼ã«Bã«ä¾åããmain.goã¯ã¢ã¸ã¥ã¼ã«Aã«ä¾åãã¦ãã¾ããããã§ãAããBã使ãããã«replaceã使ã£ã¦ãã¼ã«ã«ãã¹ãæãããã«ãã¾ãã
module A go 1.17 require B v0.0.0 replace B => ../B
ããã¦ã«ã¼ãç´ä¸ã®go.modã§ãã®Aãrequireãã¾ãã
module main-module go 1.17 require A v0.0.0 replace A => ./A
Aã»Bã¯èªèº«ã®ã¢ã¸ã¥ã¼ã«åãããã¹ãé¢æ°Helloãæã£ã¦ãã¾ãããAã®Helloå ã§Bã®Helloãå¼ã¶ãã¨ã«ãã¾ãã
package A import ( "B" "fmt" ) func Hello() { fmt.Println("This is module A") B.Hello() }
ãã®Aã®Helloé¢æ°ãmain.goã§å¼ã³ã¾ãã
package main import "A" func main() { A.Hello() }
ãã®ãã«ãã¯å¤±æããé常ã«ãããã«ããã¨ã©ã¼ãåºã¾ãã
⯠go run ./main.go A/main.go:4:5: missing go.sum entry for module providing package B (imported by A); to add: go get [email protected]
replaceã§ãã¦ããªãã®ã§ãgo buildã§ã¯Bãé常ã®ã¢ã¸ã¥ã¼ã«ã¨ãã¦èªèãããã§ãã¯ãµã ã確èªãããã¨ãã¾ãï¼ãã¶ãï¼ãããããgo.sumã«Bã«ã¤ãã¦ã®è¨è¿°ããªãã®ã§ãã¡ããã¨go getã§ãã¦ãªãããããªãï¼ã¨ããã¨ã©ã¼ãåãã¦ããã¨ããäºã ã¨æãã¾ãï¼ãã¶ãï¼ã
ããã§ã«ã¼ãç´ä¸ã®go.modã§Bã«å¯¾ããreplaceãæ¸ãã¦ããã¨æ£ãããã«ããããã¨ãã§ãã¾ãã
module main-module go 1.17 require A v0.0.0 replace A => ./A replace B => ./B
⯠go run ./main.go This is module A This is module B
go.sum
- é¥ãããã誤解ï¼package-lock.jsonã®ãããªããã¯ãã¡ã¤ã«
- å®éã®æåï¼ã¢ã¸ã¥ã¼ã«ã®ãããã¼ã¸ã§ã³ã®ããã·ã¥å¤ãè¨é²ãããã®
https://golang.org/ref/mod#go-sum-files
ããã¯ããã¯ãã¡ã¤ã«ã§ã¯ããã¾ãããã¢ã¸ã¥ã¼ã«ã®ããã·ã¥ãè¨ç®ããè¨æ¶ãã¦ããã ãã§ãã ããã«ãããåããã¼ã¸ã§ã³ã»åãã¢ã¸ã¥ã¼ã«åã§æ¹ãããããã¢ã¸ã¥ã¼ã«ããã£ãã¨ããæ¹ããããããã¨ãæ¤ç¥ã§ããããã«ãªã£ã¦ãã¾ãï¼ãªã®ã§ããªãã¸ããªã«å«ãã¦ãããæ¹ãè¯ãï¼ã
ã¾ã¨ã
å ¬å¼ãªãã¡ã¬ã³ã¹ãèªã¿ã¾ãããã
以ä¸ã§ããã¢ããã³ãã«ã¬ã³ãã¼ã®ä»ã®è¨äºããæ¯éã楽ãã¿ãã ããã
*1:ã ã£ã¦minimumãselectããã£ã¦æ¸ãã¦ãããããï¼
*2:ãã ãå¾è¿°ããããã«ãããã¯mainã¢ã¸ã¥ã¼ã«ã®go.modã«æ¸ãããreplaceã®ã¿ãåæ ããããããä¾åå ã®replaceã¯æ©è½ãã¾ãã
*3:ãã¶ã
*4:ã¿ã°ãä»ãã¦ãããã®ãããã¾ãgithub.com
*5:ã¿ããªããgo modules使ã£ã¦ããããããªãã¨ã¯ããªãã¦å¤§ä¸å¤«ã ããï¼ï¼