[lectures] Add modules lecture.
This commit is contained in:
parent
1f33a6f1a6
commit
565402290d
1 changed files with 660 additions and 0 deletions
660
lectures/05-modules/lectures.slide
Normal file
660
lectures/05-modules/lectures.slide
Normal file
|
@ -0,0 +1,660 @@
|
|||
Modules
|
||||
Лекция 5
|
||||
|
||||
Арсений Балобанов
|
||||
|
||||
* Before modules
|
||||
|
||||
* Before modules
|
||||
|
||||
Install go.
|
||||
|
||||
# export PATH=$PATH:$GOROOT/bin
|
||||
# go version
|
||||
go version go1.10.8 linux/amd64
|
||||
|
||||
Create workspace.
|
||||
|
||||
mkdir -p go
|
||||
export GOPATH=./go
|
||||
|
||||
- *GOROOT* -- where go distribution is installed
|
||||
- *GOPATH* -- where all go code is stored
|
||||
|
||||
* Before modules
|
||||
|
||||
# go help
|
||||
Go is a tool for managing Go source code.
|
||||
|
||||
Usage:
|
||||
go command [arguments]
|
||||
|
||||
The commands are:
|
||||
build compile packages and dependencies
|
||||
clean remove object files and cached files
|
||||
doc show documentation for package or symbol
|
||||
env print Go environment information
|
||||
bug start a bug report
|
||||
fix update packages to use new APIs
|
||||
fmt gofmt (reformat) package sources
|
||||
generate generate Go files by processing source
|
||||
get download and install packages and dependencies
|
||||
install compile and install packages and dependencies
|
||||
list list packages
|
||||
run compile and run Go program
|
||||
test test packages
|
||||
tool run specified go tool
|
||||
version print Go version
|
||||
vet report likely mistakes in packages
|
||||
...
|
||||
|
||||
* Before modules
|
||||
|
||||
Use *go*help*[command]* for more information about a command.
|
||||
|
||||
# go help env
|
||||
usage: go env [-json] [var ...]
|
||||
|
||||
Env prints Go environment information.
|
||||
|
||||
By default env prints information as a shell script
|
||||
(on Windows, a batch file). If one or more variable
|
||||
names is given as arguments, env prints the value of
|
||||
each named variable on its own line.
|
||||
|
||||
The -json flag prints the environment in JSON format
|
||||
instead of as a shell script.
|
||||
|
||||
For more about environment variables, see 'go help environment'.
|
||||
|
||||
* Before modules
|
||||
|
||||
# go env
|
||||
GOARCH="amd64"
|
||||
GOBIN=""
|
||||
GOCACHE="/root/.cache/go-build"
|
||||
GOEXE=""
|
||||
GOHOSTARCH="amd64"
|
||||
GOHOSTOS="linux"
|
||||
GOOS="linux"
|
||||
GOPATH="/go"
|
||||
GORACE=""
|
||||
GOROOT="/usr/local/go"
|
||||
GOTMPDIR=""
|
||||
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
|
||||
GCCGO="gccgo"
|
||||
CC="gcc"
|
||||
CXX="g++"
|
||||
CGO_ENABLED="1"
|
||||
CGO_CFLAGS="-g -O2"
|
||||
CGO_CPPFLAGS=""
|
||||
CGO_CXXFLAGS="-g -O2"
|
||||
CGO_FFLAGS="-g -O2"
|
||||
CGO_LDFLAGS="-g -O2"
|
||||
PKG_CONFIG="pkg-config"
|
||||
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -gno-record-gcc-switches"
|
||||
|
||||
* Before modules
|
||||
|
||||
- *GOARCH* -- target compilation architecture, e.g. amd64, arm
|
||||
- *GOOS* -- target operating system, e.g. linux, darwin, windows
|
||||
|
||||
* Before modules
|
||||
|
||||
- *go*install* -- compiles and installs the packages named by the import paths.
|
||||
|
||||
.link https://github.com/golang/vgo https://github.com/golang/vgo
|
||||
|
||||
# go install golang.org/x/vgo
|
||||
can't load package: package golang.org/x/vgo: cannot find package "golang.org/x/vgo" in any of:
|
||||
/usr/local/go/src/golang.org/x/vgo (from $GOROOT)
|
||||
/go/src/golang.org/x/vgo (from $GOPATH)
|
||||
|
||||
* Before modules
|
||||
|
||||
- *go*get* -- downloads the packages named by the import paths, along with their dependencies.
|
||||
It then installs the named packages like *go*install*.
|
||||
|
||||
# go get golang.org/x/vgo
|
||||
# tree -L 4 $GOPATH
|
||||
/go
|
||||
|-- bin
|
||||
| `-- vgo
|
||||
`-- src
|
||||
`-- golang.org
|
||||
`-- x
|
||||
|-- text
|
||||
`-- vgo
|
||||
|
||||
- *golang.org/x* -- namespace
|
||||
- *text*, *vgo* -- projects
|
||||
|
||||
* Before modules
|
||||
|
||||
- *$GOPATH/bin* -- executable files
|
||||
- *$GOPATH/src* -- source files e.g. .go
|
||||
|
||||
* Before modules
|
||||
|
||||
# mkdir -p src/github.com/verytable/hello
|
||||
# cat src/github.com/verytable/hello/main.go
|
||||
package main
|
||||
|
||||
func main() {
|
||||
fmt.Println("Hello, World!")
|
||||
}
|
||||
|
||||
- *go*run* compiles and runs the main package comprising the named Go source files.
|
||||
|
||||
# go run src/github.com/verytable/hello/main.go
|
||||
# command-line-arguments
|
||||
src/github.com/verytable/hello/main.go:4:2: undefined: fmt
|
||||
|
||||
* Before modules
|
||||
|
||||
Install goimports
|
||||
|
||||
# go get golang.org/x/tools/cmd/goimports
|
||||
# tree -L 2 $GOPATH
|
||||
/go
|
||||
|-- bin
|
||||
| |-- goimports
|
||||
| `-- vgo
|
||||
`-- src
|
||||
|-- github.com
|
||||
`-- golang.org
|
||||
# export PATH=$GOPATH/bin:$PATH
|
||||
|
||||
* Before modules
|
||||
|
||||
Fix imports and format file.
|
||||
|
||||
# goimports -w src/github.com/verytable/hello/main.go
|
||||
# cat src/github.com/verytable/hello/main.go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
fmt.Println("Hello, World!")
|
||||
}
|
||||
|
||||
Compile and run.
|
||||
|
||||
# go run src/github.com/verytable/hello/main.go
|
||||
Hello, World!
|
||||
|
||||
* Before modules
|
||||
|
||||
- *gofmt* -- gofmt formats Go programs
|
||||
- *go*fmt* -- runs the command 'gofmt -l -w'
|
||||
- *goimports* -- updates Go import lines, adding missing ones and removing unreferenced ones; also formats your code
|
||||
|
||||
* Before modules
|
||||
|
||||
# go build github.com/verytable/hello
|
||||
# ./hello
|
||||
Hello, World!
|
||||
|
||||
- *go*build* -- compiles the packages named by the import paths along with their dependencies, but it does not install the results.
|
||||
|
||||
* Before modules
|
||||
|
||||
# go install github.com/verytable/hello
|
||||
# tree -L 2 $GOPATH
|
||||
/go
|
||||
|-- bin
|
||||
| |-- goimports
|
||||
| |-- hello
|
||||
| `-- vgo
|
||||
|-- hello
|
||||
`-- src
|
||||
|-- github.com
|
||||
`-- golang.org
|
||||
|
||||
Run installed binary.
|
||||
|
||||
# $GOPATH/bin/hello
|
||||
Hello, World!
|
||||
|
||||
- *go*install* -- compiles and installs the packages named by the import paths.
|
||||
|
||||
* Before modules
|
||||
|
||||
# mkdir -p src/github.com/verytable/string
|
||||
# cat src/github.com/verytable/string/string.go
|
||||
package string
|
||||
|
||||
func Reverse(s string) string {
|
||||
b := []byte(s)
|
||||
for i := 0; i < len(b)/2; i++ {
|
||||
j := len(b) - i - 1
|
||||
b[i], b[j] = b[j], b[i]
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
Compile.
|
||||
|
||||
# go build github.com/verytable/string
|
||||
# echo $?
|
||||
0
|
||||
|
||||
* Before modules
|
||||
|
||||
Install package
|
||||
|
||||
# go install github.com/verytable/string
|
||||
# tree -L 2 $GOPATH
|
||||
/go
|
||||
|-- bin
|
||||
| |-- goimports
|
||||
| |-- hello
|
||||
| `-- vgo
|
||||
|-- pkg
|
||||
| `-- linux_amd64
|
||||
`-- src
|
||||
|-- github.com
|
||||
`-- golang.org
|
||||
|
||||
- *$GOPATH/pkg* -- compiled libraries e.g. .a
|
||||
|
||||
* Before modules
|
||||
|
||||
# tree -L 4 $GOPATH/pkg
|
||||
/go/pkg
|
||||
`-- linux_amd64
|
||||
`-- github.com
|
||||
`-- verytable
|
||||
`-- string.a
|
||||
|
||||
- *linux_amd64* -- ${GOOS}_${GOARCH}
|
||||
|
||||
* Before modules
|
||||
|
||||
Let's use string package.
|
||||
|
||||
# cat src/github.com/verytable/hello/main.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/verytable/string"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(string.Reverse("Hello, World!"))
|
||||
}
|
||||
|
||||
Install and run.
|
||||
|
||||
# go install github.com/verytable/hello
|
||||
# hello
|
||||
!dlroW ,olleH
|
||||
|
||||
* Before modules
|
||||
|
||||
Add dependency.
|
||||
|
||||
# cat src/github.com/verytable/hello/main.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/verytable/string"
|
||||
"rsc.io/sampler"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(string.Reverse("Hello, World!"))
|
||||
fmt.Println(sampler.Glass())
|
||||
}
|
||||
|
||||
Compile and run.
|
||||
|
||||
# go run src/github.com/verytable/hello/main.go
|
||||
src/github.com/verytable/hello/main.go:7:2: cannot find package "rsc.io/sampler" in any of:
|
||||
/usr/local/go/src/rsc.io/sampler (from $GOROOT)
|
||||
/go/src/rsc.io/sampler (from $GOPATH)
|
||||
|
||||
* Before modules
|
||||
|
||||
Download dependencies.
|
||||
|
||||
# go get -v github.com/verytable/hello
|
||||
Fetching https://rsc.io/sampler?go-get=1
|
||||
Parsing meta tags from https://rsc.io/sampler?go-get=1 (status code 200)
|
||||
get "rsc.io/sampler": found meta tag get.metaImport{Prefix:"rsc.io/sampler", VCS:"git", RepoRoot:"https://github.com/rsc/sampler"} at https://rsc.io/sampler?go-get=1
|
||||
rsc.io/sampler (download)
|
||||
|
||||
Compile and run.
|
||||
|
||||
# go run src/github.com/verytable/hello/main.go
|
||||
!dlroW ,olleH
|
||||
I can eat glass and it doesn't hurt me.
|
||||
|
||||
* Before modules
|
||||
|
||||
- *go*list* -- lists the packages named by the import paths, one per line.
|
||||
|
||||
List packages.
|
||||
|
||||
# go list github.com/verytable/hello
|
||||
github.com/verytable/hello
|
||||
|
||||
List package files.
|
||||
|
||||
# go list -f {{.GoFiles}} github.com/verytable/hello
|
||||
[main.go]
|
||||
|
||||
List package imports.
|
||||
|
||||
# go list -f {{.Imports}} github.com/verytable/hello
|
||||
[fmt github.com/verytable/string rsc.io/sampler]
|
||||
|
||||
Run 'go help list' to see all format options.
|
||||
|
||||
* Before modules
|
||||
|
||||
- A workspace ($GOPATH) contains many version control repositories (managed by Git, for example).
|
||||
- Each repository contains one or more packages.
|
||||
- Each package consists of one or more Go source files in a single directory.
|
||||
- The path to a package's directory determines its import path.
|
||||
|
||||
* Modules
|
||||
|
||||
* Modules
|
||||
|
||||
# go mod init github.com/verytable/hello
|
||||
go: creating new go.mod: module github.com/verytable/hello
|
||||
# cat go.mod
|
||||
module github.com/verytable/hello
|
||||
|
||||
go 1.16
|
||||
|
||||
- *package* -- collection of source files in the same directory that are compiled together
|
||||
- *module* -- collection of related Go packages that are released together
|
||||
- github.com/verytable/hello -- *module*path*, the import path prefix for all packages within the module
|
||||
|
||||
* Modules
|
||||
|
||||
- *import*path* -- string used to import a package
|
||||
|
||||
For example, the module `github.com/google/go-cmp` contains a package in the directory `cmp/`.
|
||||
That package's import path is `github.com/google/go-cmp/cmp`.
|
||||
|
||||
* Modules
|
||||
|
||||
# cat hello.go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
fmt.Println("Hello, world!")
|
||||
}
|
||||
|
||||
Install binary.
|
||||
|
||||
# go env -w GOBIN=/tmp/bin
|
||||
# go install .
|
||||
# /tmp/bin/hello
|
||||
Hello, world!
|
||||
# go env -u GOBIN
|
||||
|
||||
* Modules
|
||||
|
||||
# git init
|
||||
Initialized empty Git repository in /tmp/hello/.git/
|
||||
# git add hello.go go.mod
|
||||
# git commit -m "initial commit"
|
||||
[master (root-commit) f22a6c1] initial commit
|
||||
2 files changed, 10 insertions(+)
|
||||
create mode 100644 go.mod
|
||||
create mode 100644 hello.go
|
||||
|
||||
* Modules
|
||||
|
||||
# mkdir -p morestrings
|
||||
# cat morestrings/reverse.go
|
||||
package morestrings
|
||||
|
||||
func ReverseRunes(s string) string {
|
||||
r := []rune(s)
|
||||
for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
|
||||
r[i], r[j] = r[j], r[i]
|
||||
}
|
||||
return string(r)
|
||||
}
|
||||
# go build ./morestrings
|
||||
|
||||
|
||||
* Modules
|
||||
|
||||
Check build.
|
||||
|
||||
# go build ./morestrings
|
||||
|
||||
- *GOCACHE* -- 'go build' internal cache location.
|
||||
|
||||
go command caches build outputs for reuse in future builds. Run 'go help cache' for more info.
|
||||
|
||||
* Modules
|
||||
|
||||
Use subpackage.
|
||||
|
||||
# cat hello.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/verytable/hello/morestrings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))
|
||||
}
|
||||
# go install github.com/verytable/hello
|
||||
# hello
|
||||
Hello, Go!
|
||||
|
||||
* Modules
|
||||
|
||||
Add external dependency.
|
||||
|
||||
# cat hello.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/verytable/hello/morestrings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))
|
||||
fmt.Println(cmp.Diff("Hello World", "Hello Go"))
|
||||
}
|
||||
|
||||
* Modules
|
||||
|
||||
# go mod tidy
|
||||
go: finding module for package github.com/google/go-cmp/cmp
|
||||
go: downloading github.com/google/go-cmp v0.5.5
|
||||
go: found github.com/google/go-cmp/cmp in github.com/google/go-cmp v0.5.5
|
||||
# go install
|
||||
# hello
|
||||
Hello, Go!
|
||||
string(
|
||||
- "Hello World",
|
||||
+ "Hello Go",
|
||||
)
|
||||
|
||||
Requirements are stored in go.mod.
|
||||
|
||||
# cat go.mod
|
||||
module github.com/verytable/hello
|
||||
|
||||
go 1.16
|
||||
|
||||
require github.com/google/go-cmp v0.5.5
|
||||
|
||||
* Modules
|
||||
|
||||
- *go*mod*tidy* makes sure go.mod matches the source code in the module
|
||||
|
||||
Run 'go mod help tidy' for details.
|
||||
|
||||
* Modules
|
||||
|
||||
Modules are downloaded to *$GOPATH/pkg/mod*.
|
||||
|
||||
# tree -L 2 $GOPATH/pkg/mod/github.com/google
|
||||
...
|
||||
├── go-cmp@v0.4.0
|
||||
│ ├── cmp
|
||||
│ ├── CONTRIBUTING.md
|
||||
│ ├── go.mod
|
||||
│ ├── go.sum
|
||||
│ ├── LICENSE
|
||||
│ └── README.md
|
||||
├── go-cmp@v0.5.5
|
||||
│ ├── cmp
|
||||
│ ├── CONTRIBUTING.md
|
||||
│ ├── go.mod
|
||||
│ ├── go.sum
|
||||
│ ├── LICENSE
|
||||
│ └── README.md
|
||||
...
|
||||
|
||||
* Modules
|
||||
|
||||
- *go*clean* -- removes object files from package source directories
|
||||
|
||||
Run 'go clean -modcache' to remove all downloaded modules.
|
||||
|
||||
* Modules
|
||||
|
||||
# go list -m -f {{.Path}}{{.Version}} all
|
||||
github.com/verytable/hello
|
||||
github.com/google/go-cmpv0.5.5
|
||||
golang.org/x/xerrorsv0.0.0-20191204190536-9bdfabe68543
|
||||
|
||||
Format options.
|
||||
|
||||
type Module struct {
|
||||
Path string // module path
|
||||
Version string // module version
|
||||
Versions []string // available module versions (with -versions)
|
||||
Replace *Module // replaced by this module
|
||||
Time *time.Time // time version was created
|
||||
Update *Module // available update, if any (with -u)
|
||||
Main bool // is this the main module?
|
||||
Indirect bool // is this module only an indirect dependency of main module?
|
||||
Dir string // directory holding files for this module, if any
|
||||
GoMod string // path to go.mod file used when loading this module, if any
|
||||
GoVersion string // go version used in module
|
||||
Retracted string // retraction information, if any (with -retracted or -u)
|
||||
Error *ModuleError // error loading module
|
||||
}
|
||||
|
||||
|
||||
|
||||
* Modules
|
||||
|
||||
- *go.sum* -- stores the expected cryptographic hashes of the content of specific module versions
|
||||
|
||||
# cat go.sum
|
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
||||
* Modules
|
||||
|
||||
- *go*mod*graph* prints the module requirement graph
|
||||
|
||||
# go mod graph
|
||||
github.com/verytable/hello github.com/google/go-cmp@v0.5.5
|
||||
github.com/google/go-cmp@v0.5.5 golang.org/x/xerrors@v0.0.0-20191204190536-9bdfabe68543
|
||||
|
||||
* Modules
|
||||
|
||||
- *go*mod*why* shows a shortest path in the import graph from the main module to the package
|
||||
|
||||
# go mod why golang.org/x/xerrors
|
||||
# golang.org/x/xerrors
|
||||
github.com/verytable/hello
|
||||
github.com/google/go-cmp/cmp
|
||||
github.com/google/go-cmp/cmp.test
|
||||
github.com/google/go-cmp/cmp/cmpopts
|
||||
golang.org/x/xerrors
|
||||
|
||||
* Modules
|
||||
|
||||
- *go*mod*vendor* -- copies module requirements to ./vendor directory
|
||||
|
||||
Vendor dependencies.
|
||||
|
||||
# go mod vendor
|
||||
# tree -L 3 ./vendor
|
||||
./vendor
|
||||
├── github.com
|
||||
│ └── google
|
||||
│ └── go-cmp
|
||||
└── modules.txt
|
||||
|
||||
* Modules
|
||||
|
||||
# cat vendor/modules.txt
|
||||
# github.com/google/go-cmp v0.5.5
|
||||
## explicit
|
||||
github.com/google/go-cmp/cmp
|
||||
github.com/google/go-cmp/cmp/internal/diff
|
||||
github.com/google/go-cmp/cmp/internal/flags
|
||||
github.com/google/go-cmp/cmp/internal/function
|
||||
github.com/google/go-cmp/cmp/internal/value
|
||||
|
||||
|
||||
* Modules
|
||||
|
||||
- *GO111MODULE* controls how Go imports packages. on, off or auto.
|
||||
|
||||
*Go*1.11*
|
||||
|
||||
- *on* will force using Go modules even if the project is in your GOPATH. Requires go.mod to work.
|
||||
- *off* forces Go to behave the GOPATH way, even outside of GOPATH.
|
||||
- *auto* (default). In this mode, Go will behave
|
||||
similarly to *on* when you are outside of GOPATH,
|
||||
similarly to *off* when you are inside the GOPATH even if a go.mod is present.
|
||||
|
||||
|
||||
* Modules
|
||||
|
||||
*Go*1.13*
|
||||
|
||||
*GO111MODULE=auto*
|
||||
|
||||
- *on* anywhere there is a go.mod OR anywhere outside the GOPATH even if there is no go.mod.
|
||||
- *off* in the GOPATH with no go.mod.
|
||||
|
||||
* Modules
|
||||
|
||||
*Go*1.16*
|
||||
|
||||
*on* is a default.
|
||||
|
||||
- *auto* could be used for previous previous behaviour
|
||||
|
||||
*Go*1.17*
|
||||
|
||||
*GO111MODULE* is will be ignored.
|
||||
|
||||
* Ссылки:
|
||||
|
||||
.link https://golang.org/cmd/go/ - go cmd
|
||||
.link https://play-with-go.dev/ - play-with-go
|
Loading…
Reference in a new issue