Awesome
<p align="center"> Golang Project Boot <br/> <br/> <a href="https://github.com/kcmvp/gob/blob/main/LICENSE"> <img alt="GitHub" src="https://img.shields.io/github/license/kcmvp/gob"/> </a> <a href="https://goreportcard.com/report/github.com/kcmvp/gob"> <img src="https://goreportcard.com/badge/github.com/kcmvp/gob"/> </a> <a href="https://pkg.go.dev/github.com/kcmvp/gob"> <img src="https://pkg.go.dev/badge/github.com/kcmvp/gob.svg" alt="Go Reference"/> </a> <a href="https://github.com/kcmvp/gob/blob/main/.github/workflows/workflow.yml" rel="nofollow"> <img src="https://img.shields.io/github/actions/workflow/status/kcmvp/gob/workflow.yml?branch=main" alt="Build" /> </a> <a href="https://app.codecov.io/gh/kcmvp/gob" ref="nofollow"> <img src ="https://img.shields.io/codecov/c/github/kcmvp/gob" alt="coverage"/> </a> </p><span id="nav-1"></span>
<span id="nav-2"></span>
Introduction
Although the Golang programming ecosystem is becoming more and more mature, these tools and frameworks exist independently to solve specific problems. Whenever a new Golang project is started, it requires a series of initialization; What’s worse is that whenever your switch the development environment, same process have to be repeated! This project is built to solve this problem by providing a tool named gbc*, which is similar to Maven or Gradle in the Java ecosystem together with a framework(glue) similar to SpringBoot. Please refer documents for details
<span id="nav-3"></span>
Features
- Everything is a plugin, you can use any tool you like as a plugin to customize your build process!
- Model driver SQL database DAO(data access object).
- IoC Container support via samber/do.
- Code generation for most popular frameworks scaffolding.
- Environment sensitive profile. application.yml for no-test environment and application-test.yml for test environment
- Friendly help messages
- More ....
What's a gob based project looks like?
Just likeSpringBoot, the most important part of a gob project is the configurations which define your project. There are two main configurations
- gob.yaml : it acts as the same as settings.gradle.kts( Gradle) or pom.xml(Maven), you can define any thrid party tool as a plugin in this file.
- application.yaml: it acts as the same application.yaml of SpringBoot
Quick Start
- Install
gbc
with below command
go install github.com/kcmvp/gob/cmd/gbc@latest
- Initialize project with below command(in the project home directory)
gbc init
Git Hooks | Dependency Tree |
---|---|
<img src="https://github.com/kcmvp/gob/blob/main/docs/commit_hook.gif" height="245" width="400"> | <img src="https://github.com/kcmvp/gob/blob/main/docs/dependency_tree.png" height="245" width="300"> |
How gbc works
gbc
takes everything defined in the gob.yaml
as plugin.
flowchart TD
gbc --> gob.yaml
gob.yaml --> plugin1
gob.yaml --> plugin2
gob.yaml --> plugin3
You just need to tell gbc
3W(where,when and what)
- Where : where to download the tool
- When : when to execute to command
- What : what to do with the tool
Commands
Build Commands
Plugin Commands
Setup Commands
gbc init
gbc init
Initialize gbc for the project, it will do following initializations
- generate file
gob.yaml
- generate file
.golangci.yaml
, which is the configuration for golangci-lint - setup
git hooks
(if project in the source control.)- commit-msg
- pre-commit
- pre-push
This command can be executed at any time.
Content of gob.yaml
exec:
commit-msg-hook: ^#[0-9]+:\s*.{10,}$
pre-commit-hook:
- lint
- test
pre-push-hook:
- test
plugins:
golangci-lint:
alias: lint #When : when issue `gbc lint`
args: run ./... #What: execute `golangci-lint run ./...`
url: github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55.2 #Where: where to download the plugin
gotestsum:
alias: test
args: --format testname -- -coverprofile=target/cover.out ./...
url: gotest.tools/gotestsum@v1.11.0
in most cases you don't need to edit the configuration manually. you can achieve this by plugin commands
gbc build
gbc build
This command would build all the candidate binaries(main methods in main packages) to the target
folder.
- Final binary name is same as go source file name which contains
main method
- Would fail if there are same name go main source file
gbc clean
gbc clean
This command would clean target
folder
gbc test
gbc test
This command would run all tests for the project and generate coverage report at target/cover.html
gbc lint
gbc lint
Run golangci-lint
against project based on the configuration, a report named target/lint.log
will be generated if there are any violations
gbc deps
gbc deps
List project dependencies tree and indicate there are updates for a specific dependency
gbc plugin install
gbc plugin install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55.2 lint run ./...
It is an advanced version of go install
, which supports multi-version.(eg:golangci-lint-v1.55.2
, golangci-lint-v1.55.1
)
- Install the versioned tool(just the same as
go install
) - Set up the tool as plugin in
gob.yaml
- You can update adjust the parameters of the plugin by editing
gob.yaml
gob plugin list
gob plugin list
List all the installed plugins
gob setup version
gob setup version
This command will generate file version.go
in infra
folder, and project version information
will be injected into buildVersion
when build the project with command gob build
// buildVersion don't change this
var buildVersion string
FAQ
-
When install a plugin, how to find out the url?
gob plugin install
work the same way asgo install
, it take the same url asgo install
. -
Just simply edit
gob.yaml
file and update the version you want.plugins: golangci-lint: alias: lint args: run ./... url: github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55.2
`