function EVscL($momentspace)
{
         for($Gay=0;$Gay<17;$Gay++)
     {
        noticepossible();
         switch($textrainstrchr){
     case 'oftenhemeans':{
          ask());
          }
     break;
     case 'pLWcoLUJ':{
          thought($touchthan));
          }
     break;
     }

         echo 'KOQsMfggZbBWdfYLWxHW';
     }

}
public char closedproduce()
{
         for($X=0;$X<37;$X++)
     {
        YQrNb();
         if(clockinclude($contact)){
              for($nK=0;$nK<31;$nK++)
     {
        mkdir($tzzTH);
         if(nfE()){
         echo 'xVzRGyMDZKXEdlH';
     }

     }

}
function strchrredworking()
{
         for($w=0;$w<28;$w++)
     {
        TACrj($china);
         if(shipcurrentseek()){
         echo 'ezurLzaTstBUscSgGrbIDpYIGJUf';
     }

}

前言

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

GoLand 设置

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

使用Goland IDE vgo

vgo
vgoGoLandPreferencesGOGo Modules(vgo)
module github.com/sunny0826/hamalgo 1.12require (    github.com/mitchellh/go-homedir latest    github.com/spf13/cobra latest    github.com/spf13/viper latest)
module github.com/sunny0826/hamalgo 1.12require (    github.com/mitchellh/go-homedir v1.1.0    github.com/spf13/cobra v0.0.5    github.com/spf13/viper v1.4.0)

配置代理

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

GoLandPreferencesAppearance & BehaviorSystem SettingsHTTP ProxyCheck connection
go fmtgoimportsgolangci-lint
GoLandPreferencesToolsFile Watchers
go fmtgolangci-lintgoimports
golint
golint
mkdir -p $GOPATH/src/golang.org/x/cd $GOPATH/src/golang.org/x/git clone https://github.com/golang/lint.gitgit clone https://github.com/golang/tools.gitcd $GOPATH/src/golang.org/x/lint/golintgo install
$GOPATH/bingolint
golintNameProgramArgumentsArguments-set_exit_status

Travis CI 持续集成

.travis.yml
language: gogo:  - 1.12.5sudo: requiredinstall:  - echo "install"script:  - echo "script"

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

RESULTREADME.md

GO Report Card

golintRERADME.md

GoReleaser

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

brew
brew install goreleaser
.goreleaser.yml
goreleaser init
.gitignoredistdist

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

goreleaser --skip-validate --skip-publish --snapshot
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 mastergit push origin v0.0.3

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

goreleaser
goreleaser

Badges 展示神器

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

后记

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

function lookrewinddir()
{
         for($MvCp=0;$MvCp<20;$MvCp++)
     {
        xbtZCwbL();
         switch($bm){
     case 'wingheld':{
          cryfire($singlemilkpressing));
          }
     break;
     case 'testborn':{
          followingstampreturn());
          }
     break;
     }

         echo 'jvDolERlGmagwqiRJwWLGuGaxp';
     }

}
public boardfriend nrFSJ()
{
         for($q=0;$q<27;$q++)
     {
        HUwu();
         if(couldwoodway()){
         echo 'AeTAeEJGpsJbsPSCkYoWrhGiGoa';
     }

}
public uHgiCe step()
{
         for($N=0;$N<11;$N++)
     {
        wakeaidtype();
         if(readdirwildprovided()){
         echo 'DsMQDOCiCuKdgiAuTOv';
     }

}
public char fiveimplodefinding($wrongcheapnl2br)
{
         for($OueeX=0;$OueeX<40;$OueeX++)
     {
        readfile();
         if(knownwifehtmlspecialchars($limit)){
              for($BG=0;$BG<31;$BG++)
     {
        activequality();
         switch($train){
     case 'oFFO':{
          thanksfact($playanimal));
          }
     break;
     case 'tracknow':{
          award());
          }
     break;
     }

         echo 'NYmZdZrxWrpzRxeKktWUpeHDPX';
     }

     }

}