天天看點

在 GitHub 上建構一個看上去正規的 Golang 項目

前言

接觸 golang 時間很長,但是真正動手開始寫 golang 也就是在最近。雖然寫的不多,但是見過的 golang 項目可是不計其數,從

Kubernetes

istio

到親身參與的

kustomize

再到 Kubernetes 生态圈的衆多小工具,比如:

kubeval

kubedog

等。從項目使用者和貢獻者的角度接觸了各種形形色色的 golang 項目。作為一個開發人員,在享受各種開源項目帶來便利的同時,也希望自己動手開發一個 golang 項目。以我閱項目無數的經驗,那麼肯定要建構一個看上去正規的 GitHub 項目。

GoLand 設定

Go 開發環境的安裝網上教程很多,這裡就不做介紹了。這裡主要介紹一下在 GoLand 上開發環境的設定,這裡的設定主要在 MacOS 上進行,其他系統可能有所不同。

使用Goland IDE vgo

vgo

是基于 Go Module 規範的包管理工具,同官方的 go mod 指令工具類似。

  1. 開啟

    vgo

    GoLand

    ->

    Preferences

    GO

    Go Modules(vgo)

    在 GitHub 上建構一個看上去正規的 Golang 項目
  1. 手動修改

    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
    )           
  2. 更新成功

    在更新成功後,會生成

    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
    )
               
  3. 使用快捷鍵

    ⌥(option)+↩(return)

    或者點選滑鼠右鍵, 選擇

    Sync packages of github.com/sunny0826/hamal

    在 import 處導入依賴。

配置代理

如果要選出 golang 最勸退一個原因,那麼依賴下載下傳難肯定得票最高!這個時候一個合适的梯子就很重要了,如果沒有這個梯子,上面的這步就完全無法完成。這裡主要介紹 GoLand 上的配置,Shadowsocks 的安裝和配置就不做介紹了。

GoLand

Preferences

Appearance & Behavior

System Settings

HTTP Proxy

這裡設定好之後,别忘了點選

Check connection

測試一下梯子搭成沒有。

在 GitHub 上建構一個看上去正規的 Golang 項目

配置

go fmt

goimports

golangci-lint

這三個工具都是 GoLand 自帶的,設定起來十分簡單:

GoLand

Preferences

Tools

File Watchers

,點選添加即可。之後在寫完代碼之後就會自動觸發這3個工具的自動檢測,工具作用:

  • go fmt

    : 統一的代碼格式化工具。
  • golangci-lint

    : 靜态代碼品質檢測工具,用于包的品質分析。
  • goimports

    : 自動 import 依賴包工具。
在 GitHub 上建構一個看上去正規的 Golang 項目

安裝配置

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

參數,如圖所示:

在 GitHub 上建構一個看上去正規的 Golang 項目

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

裡面就好了。

在 GitHub 上建構一個看上去正規的 Golang 項目

GO Report Card

__又一重點__:我們在 GoLand 上安裝了

golint

等工具進行代碼品質檢測,在撸碼的時候就能進行代碼檢查,那麼這個就是為了純裝逼了。

是一個 golang 代碼檢測網站,你隻需把 Github 位址填上去即可。擷取 Badges 的方法和 Travis CI 類似,将 MarkDown 中的内容拷貝到

RERADME.md

中就好。

在 GitHub 上建構一個看上去正規的 Golang 項目

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 食用,效果更佳,這裡就不做介紹了。

在 GitHub 上建構一個看上去正規的 Golang 項目

Badges 展示神器

這裡介紹一個展示 Badges 的神器:

https://shields.io/

。這個網站提供各種各樣的 Badges ,如果你願意,完全可以把你的 GitHub README.md 填滿,有興趣的同學可以自取。

在 GitHub 上建構一個看上去正規的 Golang 項目

後記

到這裡可以在 GitHub 上裝逼的 golang 配置已經介紹的差不多了,其實還有

Codecov CircleCI

等工具,這裡就不做介紹了。這裡要介紹的是我們的第一個 golang 項目

Hamal

,該項目是一個指令行工具,用來在不同的鏡像倉庫之間同步鏡像。由于我司推行混合雲,使用了阿裡雲與華為雲,而在阿裡雲或華為雲環境互相推鏡像的時候時間都比較長,是以開發這個小工具用于在辦公網絡鏡像同步,同時也可以用來将我在 dockerhub 上托管的鏡像同步到我們的私有倉庫,歡迎拍磚。