golang 以脚本运行Go程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 以脚本运行Go程序相关的知识,希望对你有一定的参考价值。

//usr/bin/env go run $0 "$@"; exit
package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Println("Hello world!")
	cwd, _ := os.Getwd()
	fmt.Println("cwd:", cwd)
	fmt.Println("args:", os.Args[1:])
}

Golang写的程序注入一些版本信息,Debug速度自然快几倍!

背景

Go程序运行时打印git提交信息编译信息
Golang编译信息注入程序
当在debug的过程中,我们需要明确当前运行的go程序是什么版本
不要浪费时间在确认版本的问题上
在go build编译的时候是可以注入外部参数的
让go程序在运行的时候就可以打印编译时候的参数情况

以gitlab-runner为例

gitlab-runner -v
Version:      11.10.1
Git revision: 1f513601
Git branch:   11-10-stable
GO version:   go1.8.7
Built:        2019-04-24T09:29:18+0000
OS/Arch:      linux/amd64

最终实现的go程序运行时终端打印的信息如下

App Name:       app-api
App Version:    v2.0.1
Build version:  84d4ffb verdor
Build time:     2019-08-06T09:58:48+0800
Git revision:   84d4ffb
Git branch:     master
Golang Version: go version go1.12.2 linux/amd64
2019-07-24 10:53:34.732 11516: http server started listening on [:20000]

具体实现

入口文件
main.go

package main

import (
    "fmt"
)

var (
    AppName      string // 应用名称
    AppVersion   string // 应用版本
    BuildVersion string // 编译版本
    BuildTime    string // 编译时间
    GitRevision  string // Git版本
    GitBranch    string // Git分支
    GoVersion    string // Golang信息
)


func main() {
    Version()
    // 你的业务代码入口
}

// Version 版本信息
func Version() {
    fmt.Printf("App Name:	%s
", AppName)
    fmt.Printf("App Version:	%s
", AppVersion)
    fmt.Printf("Build version:	%s
", BuildVersion)
    fmt.Printf("Build time:	%s
", BuildTime)
    fmt.Printf("Git revision:	%s
", GitRevision)
    fmt.Printf("Git branch:	%s
", GitBranch)
    fmt.Printf("Golang Version: %s
", GoVersion)
}

build编译构建脚本
build.sh

#!/bin/bash

set -e

PROJECT_NAME="app-api"
BINARY="app-api"

OUTPUT_DIR=output
GOOS=$(go env GOOS)

APP_NAME=${PROJECT_NAME}
APP_VERSION=$(git log -1 --oneline)
BUILD_VERSION=$(git log -1 --oneline)
BUILD_TIME=$(date "+%FT%T%z")
GIT_REVISION=$(git rev-parse --short HEAD)
GIT_BRANCH=$(git name-rev --name-only HEAD)
GO_VERSION=$(go version)

CGO_ENABLED=0 go build -a -installsuffix cgo -v -mod=vendor -ldflags "-s -X 'main.AppName=${APP_NAME}'             -X 'main.AppVersion=${APP_VERSION}'             -X 'main.BuildVersion=${BUILD_VERSION}'             -X 'main.BuildTime=${BUILD_TIME}'             -X 'main.GitRevision=${GIT_REVISION}'             -X 'main.GitBranch=${GIT_BRANCH}'             -X 'main.GoVersion=${GO_VERSION}'" -o ${OUTPUT_DIR}/${BINARY} cmd/${BINARY}.go

本质上是用 -ldflags 参数注入了的外部参数到go的变量当中
go的更多build参数帮助可以通过 go help build获取

问答

Q: 开发环境是windows,没有bash环境怎么办?
A: 都装了git的吧,那么用Git Bash终端是支持的

流水理鱼 发布!

以上是关于golang 以脚本运行Go程序的主要内容,如果未能解决你的问题,请参考以下文章

golang 以脚本运行Go程序

Golang写的程序注入一些版本信息,Debug速度自然快几倍!

图解Golang的内存分配

Golang内部构件,第5部分:运行时引导程序

Golang入门到项目实战 golang中的if语句

Golang - “go run main.go”和编译之间的区别