Hot Reload von Golang + Gin + Docker, Aufbau einer VS Code-Debug-Umgebung

Überblick

Aufbau einer Entwicklungsumgebung für das Go-Sprachframework Gin. (Unterstützt Hot Reload und VS Code Debugging)

Dieser Code wird auf GitHub veröffentlicht. https://github.com/yolo-lin/go-demo

Umgebung

Paket zur Einführung

Gin: Go Framework cosmtrek / air: Hot Reload delve: Debuggen

Vorbereitungen

.zshrc


export GO111MODULE=on

/src


$gehe mod init Paketname

Verzeichnisaufbau

Die Verzeichnisstruktur von Gin ist nicht festgelegt, daher ist das Folgende mein eigener Stil. Platzieren Sie den gesamten Hauptquellcode unter src. In Zukunft planen wir, src um Modelle und Controller zu erweitern.

.
├── .vscode
│   └── launch.json
├── docker
│   ├── go
│   │   └── Dockerfile
│   └── mysql
│       └── Dockerfile
├── src
│   ├── go.mod
│   ├── go.sum
│   ├── .air.toml
│   └── main.go
│
└── docker-compose.yml

Docker Go

/docker/go/Dockerfile


FROM golang:1.15.2

ENV GO111MODULE=on

COPY src/ /go/src/app/

WORKDIR /go/src/app

# cosmtrek/Installation von Luft
RUN go get -u github.com/cosmtrek/air
#Installation von Delve
RUN go get -u github.com/go-delve/delve/cmd/dlv

#Luft starten
CMD air -c .air.toml

MySQL

/docker/go/Dockerfile


FROM mysql:8.0

RUN chown -R mysql /var/lib/mysql && \
    chgrp -R mysql /var/lib/mysql

docker-compose

yml:./docker-compose.yml


version: '3'

networks:
    backend:
      driver: bridge

services:
    go:
        container_name: go
        build:
            context: .
            dockerfile: ./docker/go/Dockerfile
        ports:
            - 8080:8080
            - 2345:2345
        links:
            - mysql
        tty: true
        volumes:
            - ./src:/go/src/app
        depends_on:
            - mysql
        security_opt:
            - seccomp:unconfined
        cap_add:
            - SYS_PTRACE
        networks:
            - backend

    mysql:
        container_name: mysql
        build:
            context: .
            dockerfile: ./docker/mysql/Dockerfile
        environment:
            MYSQL_USER: root
            MYSQL_ROOT_PASSWORD: password
            MYSQL_DATABASE: demo
        hostname: mysql
        ports:
            - "3306:3306"
        volumes:
            - ./docker/mysql/data:/var/lib/mysql
        security_opt:
            - seccomp:unconfined
        networks:
            - backend

    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=mysql
            - PMA_USER=root
            - PMA_PASSWORD=password
        ports:
            - "8081:80"
        depends_on:
            - mysql
        networks:
            - backend

Cosmtrek / Air-Einstellungen

Leiten Sie das offizielle [air_example.toml] um (https://github.com/cosmtrek/air/blob/master/air_example.toml)

Die Beschreibung zum Debuggen wurde unten hinzugefügt

toml:/src/.air.toml


# Debug
#full_bin = "APP_ENV=dev APP_USER=air /go/bin/dlv exec ./tmp/main --headless=true --listen=:2345 --api-version=2 --accept-multiclient"

toml:/src/.air.toml


# Config file for [Air](https://github.com/cosmtrek/air) in TOML format

# Working directory
# . or absolute path, please note that the directories following must be under root.
root = "."
tmp_dir = "tmp"

[build]
# Just plain old shell command. You could use `make` as well.
cmd = "go build -o ./tmp/main ."
# Binary file yields from `cmd`.
bin = "tmp/main"

# Customize binary.
full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"

# Debug
#full_bin = "APP_ENV=dev APP_USER=air /go/bin/dlv exec ./tmp/main --headless=true --listen=:2345 --api-version=2 --accept-multiclient"

# Watch these filename extensions.
include_ext = ["go", "tpl", "tmpl", "html"]
# Ignore these filename extensions or directories.
exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules"]
# Watch these directories if you specified.
include_dir = []
# Exclude files.
exclude_file = []
# This log file places in your tmp_dir.
log = "air.log"
# It's not necessary to trigger build each time file changes if it's too frequent.
delay = 1000 # ms
# Stop running old binary when build errors occur.
stop_on_error = true
# Send Interrupt signal before killing process (windows does not support this feature)
send_interrupt = false
# Delay after sending Interrupt signal
kill_delay = 500 # ms

[log]
# Show log time
time = false

[color]
# Customize each part's color. If no color found, use the raw app log.
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"

[misc]
# Delete tmp directory on exit
clean_on_exit = true

Wenn nun "docker-compose up -d" fertig ist, wird die Konfigurationsdatei automatisch angepasst und im laufenden Betrieb neu geladen.

debuggen

vscode Installieren Sie die Erweiterung von Go und fügen Sie die folgende Debug-Einstellungsdatei hinzu.

json:/.vscode/launch.json


{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Remote",
            "type": "go",
            "request": "launch",
            "mode": "remote",
            "program": "${workspaceFolder}",
            "port": 2345,
            "host": "127.0.0.1",
            "showLog": true,
        }
    ]
}

Wenn Sie debuggen müssen, ändern Sie die Cosmtrek / Air-Einstellungen. Nachdem Sie die Entwicklung ausgetauscht und full_bins debuggt und Docker-Compose neu gestartet haben, können Sie mit vscode debuggen.

toml:/src/.air.toml


# Customize binary.
# full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"

# Debug
full_bin = "APP_ENV=dev APP_USER=air /go/bin/dlv exec ./tmp/main --headless=true --listen=:2345 --api-version=2 --accept-multiclient"

Wenn der Code jedoch aktualisiert wird, wird er automatisch aus cosmtrek / air erstellt, aber die vscode-Seite wird getrennt und Sie müssen die Verbindung manuell wiederherstellen. CleanShot 2020-09-27 at 16.22.58.png

Recommended Posts

Hot Reload von Golang + Gin + Docker, Aufbau einer VS Code-Debug-Umgebung
Golang Umweltbau
VS Code + Azure-Funktionen + Python-Umgebungskonstruktionsverfahren
Konstruktionsvorlage für die lokale Python-Entwicklungsumgebung [Flask / Django / Jupyter mit Docker + VS-Code]
Einfache Erstellung einer Python-Datenanalyseumgebung mit Windows 10 Pro x VS Code x Docker
Umgebungskonstruktion: GCP + Docker
Golang Umweltbau [goenv]
Erstellen Sie eine VS Code + Docker-Entwicklungsumgebung mit Linux VM
Docker + Django + Umgebungskonstruktion reagieren
[Linux] Aufbau einer Docker-Umgebung auf Redhat
[Docker] Python3.5 + Numpy + Matplotlib-Umgebungskonstruktion
Cross-Compilieren von Raspberry Pi und Erstellen einer Remote-Debug-Entwicklungsumgebung mit VS Code