Go workspace

在日常项目中,会大量的使用到这些基础包。 项目、基础包之间的关系图常常是这样的:

G项目包FFCGFCG
项目包Go Module
Go workspace

快速开始

创建工作区

Go workspace
workspace
$: mkdir workspace
$: cd workspace
$: go work init
go.work
go 1.18
Go workspacego version >= 1.18

创建项目

demo
$: cd workspace
$: mkdir demo
$: go mod init demo
demo/main.go
package main

import "fmt"

func main() {
    fmt.Println("hello, go workspace")
}
github.com/liujianping/foo
$ go get github.com/liujianping/foo
Go Moduledemo/main.go
package main

import (
    "fmt"

    "github.com/liujianping/foo"
)

func main() {
    fmt.Println(foo.Greet("workspace"))
}
demogo run main.godemo
$: go run main.go
main.go:6:2: no required module provides package github.com/x-mod/foo: go.mod file not found in current directory or any parent directory; see 'go help modules'
demogo.workgo.workworkspace

工作区操作

demo
$: cd workspace
$: go work use ./demo
go.work
go 1.18

use ./demo

重新运行项目:

$: cd workspace
$: go run demo/main.go
Go Workspace, 你好! Version 1.0.1
github.com/liujianping/foo
$: cd workspace
$: git clone [email protected]:liujianping/foo.git

现在,工作区目录到结构是这样的:

$: cd workspace
$: tree .
.
├── demo
│   ├── go.mod
│   ├── go.sum
│   └── main.go
├── foo
│   ├── foo.go
│   └── go.mod
└── go.work
foo.go
package foo

import "fmt"

func Greet(name string) string {
    return fmt.Sprintf("%s, 你好! Version 2.0.1", name)
}
demo
$: cd workspace
$: go run demo/main.go
Go Workspace, 你好! Version 1.0.1
github.com/liujianping/fooclonego.work
$: cd workspace
$: go work use ./foo
go.work
go 1.18

use (
	./demo
	./foo
)

再次运行项目:

$: cd workspace
$: go run demo/main.go
Go Workspace, 你好! Version 2.0.1

小结

workspaceGo workspaceGo modulereplaceworkspace