Go Project: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 54: Line 54:
===<tt>pkg</tt>===
===<tt>pkg</tt>===
===<tt>internal</tt>===
===<tt>internal</tt>===
This is the module code that shouldn't be imported in your dependents' application or libraries. This layout pattern is enforced by the Go compiler. For more details, see: {{Internal|Go_Packages#Internal_.28Private.29_Packages|Internal (Private) Packages}}
This is the module code that shouldn't be imported by the module's dependent application or libraries. This layout pattern is enforced by the Go compiler. For more details, see: {{Internal|Go_Packages#Internal_.28Private.29_Packages|Internal (Private) Packages}}


===<tt>scripts</tt>===
===<tt>scripts</tt>===

Revision as of 20:55, 14 December 2023

External

Internal

Overview

This page collects recommendation and facts about Go projects and it was mainly written with the assumption that one project lives in its own repository and contains a single module, as described in Packages, Modules, Projects and Repositories. Of course project can contain multiple modules, but that is not recommended.

A Java-style /src is not recommended.

Project Layout

This layout is inspired by:

https://github.com/golang-standards/project-layout

.
├── cmd
│    ├── myserver 
│    │    └── main.go
│    └── myclient
│         └── main.go
├── pkg
├── internal
├── scripts
│    ├── build-myserver.sh 
│    └── build-myclient.sh 
├── Makefile
├── README.md
├── go.mod
├── go.sum
└── .gitignore


Directories

cmd

The directory contains the main applications for this project. If the project has multiple executables, their code should live under their own directory, and the name of the directory should match the name of the executable. This convention aligns with the behavior of the go build command, which names the executable after the name of its parent directory. The Go code file name can be either main.go, which is preferred, or the name of the command myserver.go. Different projects use one of these two conventions. Do not put a lot of code in the /cmd directory. If you think the code can be imported and used in other projects, put it in the /pkg directory. If the code is not reusable, put it in the /internal directory. It's common to have a small main function that imports and invokes the code from the /internal and /pkg directories and nothing else.

main.go

Some project name this file myserver.go.

package main

import "fmt"

func main() {
  fmt.Print("starting my service ...\n")
}

pkg

internal

This is the module code that shouldn't be imported by the module's dependent application or libraries. This layout pattern is enforced by the Go compiler. For more details, see:

Internal (Private) Packages

scripts

This directory contain scripts to perform various build functions, install, analysis, etc.

They should be used by Makefile, which will keep the file small and simple.

Files

Makefile

Makefile should prefer to use scripts from the /scripts directory, which should keep it simple.

.PHONY: build dwm

build: myserver myclient

myserver:
	"$(CURDIR)/scripts/build-myserver.sh"

myserver:
	"$(CURDIR)/scripts/build-myclient.sh"

Example to process: https://github.com/hashicorp/terraform/blob/main/Makefile

Microservice-based Project Layout

Microservices in Go | Project Layout

TODO

Integrate Vendoring.