From d0250cc86cff7f02985e1610a1f1756efb381c42 Mon Sep 17 00:00:00 2001 From: pnguyen215 Date: Tue, 21 Feb 2023 16:22:10 +0700 Subject: [PATCH] :bulb: chore: added user guide for readme.md #2 --- README.md | 197 ++++++++++++++++++++++ assets/.gitkeep | 0 assets/go-package-layout-example.png.webp | Bin 0 -> 28534 bytes 3 files changed, 197 insertions(+) create mode 100644 assets/.gitkeep create mode 100644 assets/go-package-layout-example.png.webp diff --git a/README.md b/README.md index 92a0d63..7670bd5 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,203 @@ This is a basic layout for building API by [Golang](https://go.dev/) +### Go Directories + +/cmd +- This folder contains the main application entry point files for the project, with the directory name matching the name for the binary. +- Don't put a lot of code in the application directory. If you think the code can be imported and used in other projects, then it should live in the `/pkg` directory. If the code is not reusable or if you don't want others to reuse it, put that code in the `/internal` directory. You'll be surprised what others will do, so be explicit about your intentions! +- It's common to have a small main function that imports and invokes the code from the /internal and /pkg directories and nothing else. + +/pkg +- This folder contains code which is OK for other services to consume, this may include API clients, or utility functions which may be handy for other projects but don’t justify their own project. +- The pkg directory origins: The old Go source code used to use pkg for its packages and then various Go projects in the community started copying the pattern + +/internal +- This package holds the private library code used in your service, it is specific to the function of the service and not shared with other services. +- You can optionally add a bit of extra structure to your internal packages to separate your shared and non-shared internal code. It's not required (especially for smaller projects), but it's nice to have visual clues showing the intended package use. Your actual application code can go in the `/internal/app` directory (e.g., `/internal/app/myapp`) and the code shared by those apps in the `/internal/pkg` directory (e.g., `/internal/pkg/myprivlib`). + +/vendor +- Application dependencies (managed manually or by your favorite dependency management tool like the new built-in Go Modules feature). The go mod vendor command will create the /vendor directory for you. Note that you might need to add the -mod=vendor flag to your go build command if you are not using Go 1.14 where it's on by default. +- Don't commit your application dependencies if you are building a library. + +/api +- OpenAPI/Swagger specs, JSON schema files, protocol definition files. + +/web +- Web application specific components: static web assets, server side templates and SPAs. + +/configs +- Configuration file templates or default configs. Put your `confd` or `consul-template` template files here. + +/init +- System init (systemd, upstart, sysv) and process manager/supervisor (runit, supervisord) configs. + +/scripts +- Scripts to perform various build, install, analysis, etc operations. +- These scripts keep the root level Makefile small and simple (e.g., https://github.com/hashicorp/terraform/blob/master/Makefile). +- example: https://github.com/golang-standards/project-layout/blob/master/scripts/README.md + +/build +- Packaging and Continuous Integration. Put your cloud (AMI), container (Docker), OS (deb, rpm, pkg) package configurations and scripts in the `/build/package` directory. +- Put your CI (travis, circle, drone) configurations and scripts in the `/build/ci` directory. Note that some of the CI tools (e.g., Travis CI) are very picky about the location of their config files. Try putting the config files in the `/build/ci` directory linking them to the location where the CI tools expect them (when possible). + +/deployments +- IaaS, PaaS, system and container orchestration deployment configurations and templates (docker-compose, kubernetes/helm, mesos, terraform, bosh). Note that in some repos (especially apps deployed with kubernetes) this directory is called `/deploy`. + +/docs +- Design and user documents (in addition to your godoc generated documentation). +- example: https://github.com/golang-standards/project-layout/blob/master/docs/README.md + +/tools +- Supporting tools for this project. Note that these tools can import code from the `/pkg` and `/internal` directories. +- example: https://github.com/golang-standards/project-layout/blob/master/tools/README.md + +/examples +- Examples for your applications and/or public libraries. +- refs: https://github.com/golang-standards/project-layout/blob/master/examples/README.md + +/assets +- Other assets to go along with your repository (images, logos, etc). + +go.mod +- The `go.mod` file defines the module's module path, which is also the import path used for the root directory, and its dependency requirements, which are the other modules needed for a successful build. + +go.sum +- The `go.sum` contains all the dependency check sums, and is managed by the go tools. The checksum present in go.sum file is used to validate the checksum of each of direct and indirect dependency to confirm that none of them has been modified. + +### Naming Convention + +- Package names should be lowercase. Don't use snake_case or camelCase. +- Avoid overly use terms like util, common, script etc +- Use singular form +```bash +fooApp/ + circle.yml + Dockerfile + cmd/ + foosrv/ + main.go + foocli/ + main.go + pkg/ + fs/ + fs.go + fs_test.go + mock.go + mock_test.go + merge/ + merge.go + merge_test.go + api/ + api.go + api_test.go +``` + +> As you noticed, there is func_test.go file in the same directory. In Go, you save unit tests inside separate files with a filename ending with _test.go. Go provides go test command out of the box which executes these files and runs tests. + + +### Example + +#### Go Directories + +``` +├── LICENSE +├── README.md +├── config.go +├── go.mod +├── go.sum +├── client-lib +│ ├── lib.go +│ └── lib_test.go +├── cmd +│ ├── mod-lib-client +│ │ └── main.go +│ └── mod-lib-server +│ └── main.go +├── internal +│ └── auth +│ ├── auth.go +│ └── auth_test.go +└── server-lib + └── lib.go +``` + +``` +$ tree exitus/ + exitus/ +├── cmd +│ ├── authtest +│ │ └── main.go +│ ├── backend +│ │ └── main.go +│ └── client +│ └── main.go +├── dev +│ ├── add_migration.sh +│ └── docker-compose.yml +├── Dockerfile +├── go.mod +├── go.sum +│ ├── 20190721131113_extensions.down.sql +│ ├── 20190721131113_extensions.up.sql +│ ├── 20190723044115_customer_projects.down.sql +│ ├── 20190723044115_customer_projects.up.sql +│ ├── 20190726175158_issues.down.sql +│ ├── 20190726175158_issues.up.sql +│ ├── 20190726201649_comments.down.sql +│ ├── 20190726201649_comments.up.sql +│ ├── bindata.go +│ ├── gen.go +│ ├── migrations_test.go +│ └── README.md +├── pkg +│ ├── api +│ │ ├── exitus.gen.go +│ │ ├── exitus.yml +│ │ └── gen.go +│ ├── auth +│ │ ├── scopes.go +│ │ └── user.go +│ ├── conf +│ │ ├── conf.go +│ │ └── conf_test.go +│ ├── db +│ │ ├── db.go +│ │ ├── dbtesting.go +│ │ ├── migrate.go +│ │ ├── sqlhooks.go +│ │ └── transactions.go +│ ├── env +│ │ └── env.go +│ ├── healthz +│ │ ├── healthz.go +│ │ └── healthz_test.go +│ ├── jwt +│ │ └── jwt.go +│ ├── metrics +│ │ └── metrics.go +│ ├── middleware +│ │ ├── jwt.go +│ │ └── middleware.go +│ ├── oidc +│ │ └── client.go +│ ├── server +│ │ ├── reflect.go +│ │ └── server.go +│ └── store +│ ├── comments.go +│ ├── comments_test.go +│ ├── customers.go +│ ├── customers_test.go +│ ├── issues.go +│ ├── issues_test.go +│ ├── migrate_test.go +│ ├── projects.go +│ ├── projects_test.go +│ └── store.go +└── README.md +``` + #### Reference * https://github.com/golang-standards/project-layout * https://dev.to/jinxankit/go-project-structure-and-guidelines-4ccm diff --git a/assets/.gitkeep b/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/assets/go-package-layout-example.png.webp b/assets/go-package-layout-example.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..5699cc6f2d1ea6cdf8d1a9e3806d5ec006c6bb9e GIT binary patch literal 28534 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%0Dfun;7so+=E` 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