前言
接觸 golang 時間很長,但是真正動手開始寫 golang 也就是在最近。雖然寫的不多,但是見過的 golang 項目可是不計其數,從
Kubernetes和
istio到親身參與的
kustomize再到 Kubernetes 生态圈的衆多小工具,比如:
kubeval、
kubedog等。從項目使用者和貢獻者的角度接觸了各種形形色色的 golang 項目。作為一個開發人員,在享受各種開源項目帶來便利的同時,也希望自己動手開發一個 golang 項目。以我閱項目無數的經驗,那麼肯定要建構一個看上去正規的 GitHub 項目。
GoLand 設定
Go 開發環境的安裝網上教程很多,這裡就不做介紹了。這裡主要介紹一下在 GoLand 上開發環境的設定,這裡的設定主要在 MacOS 上進行,其他系統可能有所不同。
使用Goland IDE vgo
vgo
是基于 Go Module 規範的包管理工具,同官方的 go mod 指令工具類似。
- 開啟
,vgo
->GoLand
Preferences
GO
Go Modules(vgo)
- 手動修改
其中 latest 為最新版本,GoLand 會去下載下傳最新依賴代碼,下載下傳成功後會修改go.mod
并且生成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 )
-
更新成功
在更新成功後,會生成
檔案并修改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 )
- 使用快捷鍵
或者點選滑鼠右鍵, 選擇⌥(option)+↩(return)
在 import 處導入依賴。Sync packages of github.com/sunny0826/hamal
配置代理
如果要選出 golang 最勸退一個原因,那麼依賴下載下傳難肯定得票最高!這個時候一個合适的梯子就很重要了,如果沒有這個梯子,上面的這步就完全無法完成。這裡主要介紹 GoLand 上的配置,Shadowsocks 的安裝和配置就不做介紹了。
GoLand
Preferences
Appearance & Behavior
System Settings
HTTP Proxy
這裡設定好之後,别忘了點選
Check connection
測試一下梯子搭成沒有。
配置 go fmt
goimports
golangci-lint
go fmt
goimports
golangci-lint
這三個工具都是 GoLand 自帶的,設定起來十分簡單:
GoLand
Preferences
Tools
File Watchers
,點選添加即可。之後在寫完代碼之後就會自動觸發這3個工具的自動檢測,工具作用:
-
: 統一的代碼格式化工具。go fmt
-
: 靜态代碼品質檢測工具,用于包的品質分析。golangci-lint
-
: 自動 import 依賴包工具。goimports
安裝配置 golint
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
參數,如圖所示:
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
裡面就好了。
GO Report Card
__又一重點__:我們在 GoLand 上安裝了
golint
等工具進行代碼品質檢測,在撸碼的時候就能進行代碼檢查,那麼這個就是為了純裝逼了。
是一個 golang 代碼檢測網站,你隻需把 Github 位址填上去即可。擷取 Badges 的方法和 Travis CI 類似,将 MarkDown 中的内容拷貝到
RERADME.md
中就好。
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 食用,效果更佳,這裡就不做介紹了。
Badges 展示神器
這裡介紹一個展示 Badges 的神器:
https://shields.io/。這個網站提供各種各樣的 Badges ,如果你願意,完全可以把你的 GitHub README.md 填滿,有興趣的同學可以自取。
後記
到這裡可以在 GitHub 上裝逼的 golang 配置已經介紹的差不多了,其實還有
Codecov CircleCI等工具,這裡就不做介紹了。這裡要介紹的是我們的第一個 golang 項目
Hamal,該項目是一個指令行工具,用來在不同的鏡像倉庫之間同步鏡像。由于我司推行混合雲,使用了阿裡雲與華為雲,而在阿裡雲或華為雲環境互相推鏡像的時候時間都比較長,是以開發這個小工具用于在辦公網絡鏡像同步,同時也可以用來将我在 dockerhub 上托管的鏡像同步到我們的私有倉庫,歡迎拍磚。