Slide 1

Slide 1 text

What Is the Go Workspace Mode Yuki Ito (@mrno110) Go 1.18 Release Party

Slide 2

Slide 2 text

Merpay / Mercoin Architect Mercari Microservices Platform CI/CD Yuki Ito @mrno110

Slide 3

Slide 3 text

Disclaimer $ go version go version go1.18rc1 linux/amd64 As of this writing...

Slide 4

Slide 4 text

Agenda ɾBackground ɾWorkspace Mode ɾUse cases

Slide 5

Slide 5 text

Background ɾgithub.com/110y/gwdemo1 ɾgithub.com/110y/gwdemo2 ɾgithub.com/110y/gwdemo3 Let's assume we develop 3 modules

Slide 6

Slide 6 text

Background gwdemo3 gwdemo2 gwdemo1 Let's assume we develop 3 modules

Slide 7

Slide 7 text

Background gwdemo3 package gwdemo3 import "fmt" func Hello(s string) string { return fmt.Sprintf("Hello, %s!", s) }

Slide 8

Slide 8 text

Background gwdemo1 gwdemo2 package main import ( "fmt" "github.com/110y/gwdemo3" ) func main() { fmt.Println(gwdemo3.Hello("Workspace")) } package main import ( "fmt" "github.com/110y/gwdemo3" ) func main() { fmt.Println(gwdemo3.Hello("Generics")) }

Slide 9

Slide 9 text

Background When we add a new feature to gwdemo3... package gwdemo3 import "fmt" func Hello(s string) string { return fmt.Sprintf("Hello, %s!", s) } func Bye(s string) string { return fmt.Sprintf("Bye, %s!", s) }

Slide 10

Slide 10 text

Background And want to use it on gwdemo1 and gwdemo2 locally... package main import ( "fmt" "github.com/110y/gwdemo3" ) func main() { fmt.Println(gwdemo3.Hello("Workspace")) fmt.Println(gwdemo3.Bye("Workspace")) }

Slide 11

Slide 11 text

Background We have to add a replace directive to the go.mod fi le module github.com/110y/gwdemo1 go 1.18 require github.com/110y/gwdemo3 v0.0.0-20220218011518-502c64a9beed replace github.com/110y/gwdemo3 => ../gwdemo3

Slide 12

Slide 12 text

Background Problem ɾHave to add replace directive to each module's go.mod fi le. ɾHave to remove replace directive before submitting the code.

Slide 13

Slide 13 text

Background But working with the replace directive can often be awkward: each module developer might have working versions at di ff erent location on disk, so having the directive in a fi le that needs to be distributed with the module isn't a good fi t for all use cases. https://go.googlesource.com/proposal/+/master/design/45713-workspace.md Proposal: Multi-Module Workspaces in cmd/go

Slide 14

Slide 14 text

Agenda ɾBackground ɾWorkspace Mode ɾUse cases

Slide 15

Slide 15 text

Workspace Mode gwdemo3 gwdemo2 gwdemo1

Slide 16

Slide 16 text

Workspace Mode Workspace gwdemo3 gwdemo2 gwdemo1

Slide 17

Slide 17 text

Workspace Mode $ mkdir gwdemo-workspace $ cd gwdemo-workspace $ git clone https://github.com/110y/gwdemo1.git $ git clone https://github.com/110y/gwdemo2.git $ git clone https://github.com/110y/gwdemo3.git Workspace

Slide 18

Slide 18 text

Workspace Mode Workspace $ go work init ./gwdemo1 ./gwdemo2 ./gwdemo3

Slide 19

Slide 19 text

Workspace Mode go work init creates go.work fi le go 1.18 use ( ./gwdemo1 ./gwdemo2 ./gwdemo3 ) go.work

Slide 20

Slide 20 text

Workspace Mode $ tree . . ├── go.work ├── gwdemo1 │ ├── go.mod │ ├── go.sum │ └── main.go ├── gwdemo2 │ ├── go.mod │ ├── go.sum │ └── main.go └── gwdemo3 ├── go.mod └── gwdemo3.go

Slide 21

Slide 21 text

Workspace Mode $ cd gwdemo1 $ go env GOWORK /path/to/gwdemo-workspace/go.work Workspace

Slide 22

Slide 22 text

Workspace Mode $ go help work ... To determine whether the go command is operating in workspace mode, use the "go env GOWORK" command. This will specify the workspace file being used. ... Workspace

Slide 23

Slide 23 text

Workspace Mode package gwdemo3 import "fmt" func Hello(s string) string { return fmt.Sprintf("Hello, %s!", s) } func Bye(s string) string { return fmt.Sprintf("Bye, %s!", s) } gwdemo3

Slide 24

Slide 24 text

Workspace Mode package main import ( "fmt" "github.com/110y/gwdemo3" ) func main() { fmt.Println(gwdemo3.Hello("Workspace")) fmt.Println(gwdemo3.Bye("Workspace")) } gwdemo1

Slide 25

Slide 25 text

Workspace Mode $ cd gwdemo1 $ go env GOWORK /path/to/gwdemo-workspace/go.work $ go run . Hello, Workspace! Bye, Workspace! Workspace

Slide 26

Slide 26 text

Problem ✅ Have to add replace directive to each module's go.mod fi le. ✅ Have to remove replace directive before submitting the code. Workspace Mode

Slide 27

Slide 27 text

Workspace Mode $ cd gwdemo1 $ go env GOWORK /path/to/gwdemo-workspace/go.work $ GOWORK=off go run . # github.com/110y/gwdemo1 ./main.go:12:22: undefined: gwdemo3.Bye Check the actual behavior with GOWORK=o f

Slide 28

Slide 28 text

Workspace Mode -work fi le fl ag...? https://go-review.googlesource.com/c/go/+/385995/

Slide 29

Slide 29 text

Agenda ɾBackground ɾWorkspace Mode ɾUse cases

Slide 30

Slide 30 text

Use cases Microservice Chassis Pattern https://microservices.io/patterns/microservice-chassis.html

Slide 31

Slide 31 text

Use cases chassis application template

Slide 32

Slide 32 text

Use cases chassis application template Workspace

Slide 33

Slide 33 text

Use cases Multi Modules Monorepo ├── cmd │ ├── app1 │ │ ├── go.mod │ │ └── main.go │ ├── app2 │ │ ├── go.mod │ │ └── main.go │ └── app3 │ ├── go.mod │ └── main.go ├── go.work └── pkg ├── echo │ ├── echo.go │ └── go.mod └── hello ├── go.mod └── hello.go

Slide 34

Slide 34 text

Workspace Mode Workspace gwdemo3 gwdemo2 gwdemo1