【go】【應用編譯】

Nones發表於2024-05-31

@

目錄
  • 寫在前面
    • 1. 基本編譯
    • 2. 交叉編譯
    • 3. 最佳化構建
    • 4. 使用 Makefile
    • 5. 新增版本資訊
    • Docker 容器化
  • 參考資料
    • 基礎/標準庫/第三方庫
    • golang 導航
    • 程式設計規範
    • 演算法|面試
    • 專案


寫在前面

  • 相關博文
  • 個人部落格首頁
  • 免責宣告:僅供學習交流使用!開源框架可能存在的風險和相關後果將完全由使用者自行承擔,本人不承擔任何法律責任。

1. 基本編譯

在開發過程中,最基本的編譯命令是 go build。它會在當前目錄生成一個可執行檔案。

go build -o myapp main.go
# 其中,-o myapp 指定了輸出檔案的名稱。

2. 交叉編譯

Go 的編譯器支援交叉編譯,這意味著你可以在一個平臺上為另一個平臺生成可執行檔案。你只需要設定目標作業系統(GOOS)和目標架構(GOARCH)。

  • 在 Linux 上為 Windows 編譯:
GOOS=windows GOARCH=amd64 go build -o myapp.exe main.go
  • 在 macOS 上為 Linux 編譯:
GOOS=linux GOARCH=amd64 go build -o myapp main.go

3. 最佳化構建

在生產環境中,你可能希望生成更小、更快的可執行檔案。以下是一些常見的最佳化選項:

  • 靜態編譯:避免依賴動態庫,減少執行時依賴。
CGO_ENABLED=0 go build -a -installsuffix cgo -o myapp main.go
  • 剝離除錯資訊:減小可執行檔案的大小。
go build -ldflags="-s -w" -o myapp main.go

4. 使用 Makefile

Makefile 可以幫助你自動化構建過程,特別是在需要多步構建或複雜構建配置時。
以下是一個示例 Makefile:

# 定義變數
APP_NAME := myapp
SRC := main.go
VERSION := $(shell git describe --tags --always --dirty)
BUILD_DIR := build

# 預設目標
.PHONY: all
all: build

# 編譯
.PHONY: build
build:
	@echo "Building $(APP_NAME)..."
	GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -X main.version=$(VERSION)" -o $(BUILD_DIR)/$(APP_NAME) $(SRC)

# 清理
.PHONY: clean
clean:
	@echo "Cleaning up..."
	rm -rf $(BUILD_DIR)

# 執行
.PHONY: run
run: build
	@echo "Running $(APP_NAME)..."
	./$(BUILD_DIR)/$(APP_NAME)

在這個 Makefile 中:
    APP_NAME: 是你的應用名稱。
    SRC: 是主原始碼檔案。
    VERSION: 使用 Git 標籤來獲取版本資訊。
    BUILD_DIR: 是構建輸出目錄。

常見的目標包括:
    all: 預設目標,呼叫 build。
    build: 編譯應用。
    clean: 清理構建輸出。
    run: 編譯並執行應用。

5. 新增版本資訊

你可以在編譯時透過 -ldflags 選項將版本資訊嵌入到可執行檔案中。例如:

package main

import (
	"fmt"
)

var version string

func main() {
	fmt.Printf("Version: %s\n", version)
}
  • 使用以下命令編譯時新增版本資訊:
go build -ldflags="-X main.version=$(git describe --tags --always --dirty)" -o myapp main.go

Docker 容器化

為了確保你的應用在任何環境中都能一致執行,使用 Docker 容器化是一個好選擇。以下是一個簡單的 Dockerfile 示例:

# 構建階段
FROM golang:1.18-alpine AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp main.go

# 執行階段
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]

  • 構建 Docker 映象:
docker build -t myapp:latest .
  • 執行 Docker 容器:
docker run -it --rm myapp:latest

參考資料

基礎/標準庫/第三方庫


  • 地鼠文件:比較多資料
  • topgoer
  • go awesome
  • golang 文件學習
  • golang 標準庫
  • go 檔案常用操作

golang 導航


  • golang 收集
  • go-guide
  • golang 導航
  • go-concurrency-guide
  • go-advice
  • golang 知識路線

程式設計規範


  • golang 程式設計規範
  • golang 規範示例

演算法|面試


  • cs 面試
  • 面試網站
  • Golang後端研發崗位相關面試題和簡歷
  • 路人張的面試筆記
  • golang 演算法

專案


  • golang 專案推薦
  • 7天系列
  • go專案推薦
  • go高效能程式設計

相關文章