Golang 装逼指南:在 git hub 上构建一个看上去正规的 golang 项目

接触 golang 时间很长,但是真正动手开始写 golang 也就是在最近。跟着我在 GitHub 上构建一个看上去正规的 Golang 项目。

post thumb
作者 guoxudong 发表于 2019年7月19日 更新于 2023年11月25日

前言

接触 golang 时间很长,但是真正动手开始写 golang 也就是在最近。虽然写的不多,但是见过的 golang 项目可是不计其数,从 Kubernetesistio 到亲身参与的 kustomize 再到 Kubernetes 生态圈的众多小工具,比如: kubevalkubedog 等。从项目使用者和贡献者的角度接触了各种形形色色的 golang 项目。作为一个开发人员,在享受各种开源项目带来便利的同时,也希望自己动手开发一个 golang 项目。以我阅项目无数的经验,那么肯定要构建一个看上去正规的 GitHub 项目。

GoLand 设置

Go 开发环境的安装网上教程很多,这里就不做介绍了。这里主要介绍一下在 GoLand 上开发环境的设置,这里的设置主要在 MacOS 上进行,其他系统可能有所不同。

使用Goland IDE vgo

vgo 是基于 Go Module 规范的包管理工具,同官方的 go mod 命令工具类似。

  1. 开启 vgoGoLand->Preferences->GO->Go Modules(vgo) image

  2. 手动修改 go.mod

    其中 latest 为最新版本,GoLand 会去下载最新依赖代码,下载成功后会修改 go.mod 并且生成 go.sum 依赖分析文件。

    module github.com/sunny0826/hamal
    
    go 1.12
    
    require (
        github.com/mitchellh/go-homedir latest
        github.com/spf13/cobra latest
        github.com/spf13/viper latest
    )
    
  3. 更新成功

    在更新成功后,会生成 go.sum 文件并修改 go.mod 文件。

    module github.com/sunny0826/hamal
    
    go 1.12
    
    require (
        github.com/mitchellh/go-homedir v1.1.0
        github.com/spf13/cobra v0.0.5
        github.com/spf13/viper v1.4.0
    )
    
    
  4. 使用快捷键 ⌥(option)+↩(return) 或者点击鼠标右键, 选择 Sync packages of github.com/sunny0826/hamal 在 import 处导入依赖。

配置代理

如果要选出 golang 最劝退一个原因,那么依赖下载难肯定得票最高!这个时候一个合适的梯子就很重要了,如果没有这个梯子,上面的这步就完全无法完成。这里主要介绍 GoLand 上的配置,Shadowsocks 的安装和配置就不做介绍了。

GoLand->Preferences->Appearance & Behavior->System Settings->HTTP Proxy 这里设置好之后,别忘了点击 Check connection 测试一下梯子搭成没有。 image

配置 go fmtgoimportsgolangci-lint

这三个工具都是 GoLand 自带的,设置起来十分简单:GoLand->Preferences->Tools->File Watchers,点击添加即可。之后在写完代码之后就会自动触发这3个工具的自动检测,工具作用:

  • go fmt : 统一的代码格式化工具。
  • golangci-lint : 静态代码质量检测工具,用于包的质量分析。
  • goimports : 自动 import 依赖包工具。

image

安装配置 golint

GoLand 没有自带 golint 工具,需要手动安装:

mkdir -p $GOPATH/src/golang.org/x/
cd $GOPATH/src/golang.org/x/
git clone https://github.com/golang/lint.git
git clone https://github.com/golang/tools.git
cd $GOPATH/src/golang.org/x/lint/golint
go install

安装成功之后将会在 $GOPATH/bin 目录下看到自动生成了 golint 二进制工具文件。

GoLand 配置 golint,修改 Name, Program, Arguments 三项配置,其中 Arguments 需要加上 -set_exit_status 参数,如图所示:

image

Travis CI 持续集成

在 Github 上装逼怎么能少的了 Travis CI ,直接登录 Travis CI,使用 GitHub 登录,然后选择需要使用 Travis CI 的项目,在项目根目录添加 .travis.yml ,内容如下:

language: go

go:
  - 1.12.5

sudo: required

install:
  - echo "install"

script:
  - echo "script"

这里只是一个示例,在每次 push 代码之后,都会触发 CI,具体语法可以参看官方文档

装逼重点: 你以为使用 Travis CI 就是为了持续集成吗?那就太天真了!使用 Travis CI 当然为了他的 Badges ,将 RESULT 拷贝到你的 README.md 里面就好了。

image

GO Report Card

又一装逼重点:我们在 GoLand 上安装了 golint 等工具进行代码质量检测,在撸码的时候就能进行代码检查,那么这个就是为了纯装逼了。GO Report Card 是一个 golang 代码检测网站,你只需把 Github 地址填上去即可。获取 Badges 的方法和 Travis CI 类似,将 MarkDown 中的内容拷贝到 RERADME.md 中就好。

image

GoReleaser

持续集成有了,代码检查也有了,再下面就是怎么发布一个漂亮的 release 了。如果还在手动发布 release ,那么就又掉 low 了。使用 GoReleaser 一行命令来发布一个漂亮的 release 吧。

由于使用的的 MacOS ,这里使用 brew 来安装:

brew install goreleaser

在项目根目录生成 .goreleaser.yml 配置:

goreleaser init

配置好了以后要记得往 .gitignore 加上 dist,因为 goreleaser 会默认把编译编译好的文件输出到 dist 目录中。

goreleaser 配置好后,可以先编译测试一下:

goreleaser --skip-validate --skip-publish --snapshot

注意: 首次使用 goreleaser 要配置 GITHUB_TOKEN ,可以在这里申请,申请好之后运行下面的命令配置GITHUB_TOKEN

export GITHUB_TOKEN=<YOUR_TOKEN>

确保没有问题,那么就可以操作 git 和 goreleaser 来发布 release 了。

git add .
git commit -m "add goreleaser"
git tag -a v0.0.3 -m "First release"
git push origin master
git push origin v0.0.3

全部搞定后,一行命令起飞:

goreleaser

goreleaser 配合 CI 食用,效果更佳,这里就不做介绍了。 image

Badges 展示神器

这里介绍一个展示 Badges 的神器:https://shields.io/ 。这个网站提供各种各样的 Badges ,如果你愿意,完全可以把你的 GitHub README.md 填满,有兴趣的同学可以自取。 image

后记

到这里可以在 GitHub 上装逼的 golang 配置已经介绍的差不多了,其实还有 CodecovCircleCI 等工具,这里就不做介绍了。这里要介绍的是我们的第一个 golang 项目 Hamal,该项目是一个命令行工具,用来在不同的镜像仓库之间同步镜像。由于我司推行混合云,使用了阿里云与华为云,而在阿里云或华为云环境互相推镜像的时候时间都比较长,所以开发这个小工具用于在办公网络镜像同步,同时也可以用来将我在 dockerhub 上托管的镜像同步到我们的私有仓库,欢迎拍砖。

Tags: