Go Module 介紹

Go module是Go發行的一套套件管理系統,採用 semver.org 規範 。

通常我們撰寫Go時,會把原始碼放在$GOPATH/src目錄下,但這常常與許多程式設計師的習慣不同,大多數人都習慣將會用到的模組仿在專案目錄下。

範例

- sherrydb
    -- mysql
    example.go
    README.md
    makefile

初始化 go mod

go mod init github.com/asccclass/sherrydb

// 若出現錯誤訊息,類似:
go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'

// 請設定環境變數:
set GO111MODULE=on    //windows
export GO111MODULE=on //linux

執行完後,會在目錄下多出:go.mod 檔案,內容只有短短行:

module github.com/asccclass/sherrydb

go 1.12

接下來執行 go build ./.. ,此指令會將所有用到的模組都寫入到 go.mod 中,並產生 go.sum檔案。可以使用下列指令列出所有使用到的模組級版本號:

go list -m all

開發階段

  • 先將程式碼 git clone 下來後,進入專案目錄
  • 執行 go mod download 就可以自動將該專案對應的版本下載下來使用

若使用自性開發的模組

通常自訂套件import時會使用 ./packagename,這時候在 go run xxx.go 時go mod 就會出現類似的錯誤:

build github.com/asccclass/musicserver: cannot find module for path _/home/pi/development/golang/musicserver/libs/soundcontrol

解決方式就是把 ./xxx 改為 github.com/accname/projectname/packageName 就可以了。

部屬階段

FROM golang:1.11-alpine as build_base
RUN apk add bash ca-certificates git gcc g++ libc-dev
WORKDIR /app
# Force the go compiler to use modules
ENV GO111MODULE=on
# We want to populate the module cache based on the go.{mod,sum} files.
COPY go.mod .
COPY go.sum .
RUN go mod download

FROM build_base AS server_builder
COPY . .
ENV GOOS=linux
ENV GOARCH=amd64
RUN go build -o /facebook-account-kit -tags netgo -ldflags '-w -extldflags "-static"' .

快速指令

  • go mod init:建立新版本控制
  • go get:取得或更新函數庫
  • go mod tidy:移除未使用的函數庫
  • go list -m all:列出所有使用中的模組
  • go mod vender:vender 相依的函數庫