Go项目目录结构该怎么写?

news2025/1/22 9:08:08

原文地址:Go项目目录结构该怎么写?

Go 目录

image-20221122220821657.png

/cmd

项目的主干。

每个应用程序的目录名应该与想要的可执行文件的名称相匹配(例如,/cmd/myapp)。

不要在这个目录中放置太多代码。如果认为代码可以导入并在其他项目中使用,那么它应该位于 /pkg 目录中。如果代码不是可重用的,或者不希望其他人重用它,将该代码放到 /internal 目录中。

通常有一个小的 main 函数,从 /internal/pkg 目录导入和调用代码,除此之外没有别的东西。

相关实例:

  • https://github.com/vmware-tanzu/velero/tree/main/cmd (just a really small main function with everything else in packages)
  • https://github.com/moby/moby/tree/master/cmd
  • https://github.com/prometheus/prometheus/tree/main/cmd
  • https://github.com/influxdata/influxdb/tree/master/cmd
  • https://github.com/kubernetes/kubernetes/tree/master/cmd
  • https://github.com/dapr/dapr/tree/master/cmd
  • https://github.com/ethereum/go-ethereum/tree/master/cmd

/internal

私有应用程序和库代码。这是你不希望其他人在其应用程序或库中导入代码。请注意,这个布局模式是由 Go 编译器本身执行的。有关更多细节,可以参阅Go 1.4 release notes 。注意,并不局限于顶级 internal 目录。在项目树的任何级别上都可以有多个内部目录。

可以选择向 internal 包中添加一些额外的结构,以分隔共享和非共享的内部代码。这不是必需的(特别是对于较小的项目),但是最好有有可视化的线索来显示预期的包的用途。实际应用程序代码可以放在 /internal/app 目录下(例如 /internal/app/myapp),这些应用程序共享的代码可以放在 /internal/pkg 目录下(例如 /internal/pkg/myprivlib)。

/pkg

外部应用程序可以使用的库代码(例如 /pkg/mypubliclib)。其他项目会导入这些库,希望它们能正常工作,所以在这里放东西之前要三思:-)注意,internal 目录是确保私有包不可导入的更好方法,因为它是由 Go 强制执行的。/pkg 目录仍然是一种很好的方式,可以显式地表示该目录中的代码对于其他人来说是安全使用的好方法。由 Travis Jeffery 撰写的 I'll take pkg over internal 博客文章提供了 pkginternal 目录的一个很好的概述,以及什么时候使用它们是有意义的。

当根目录包含大量非 Go 组件和目录时,这也是一种将 Go 代码分组到一个位置的方法,这使得运行各种 Go 工具变得更加容易(正如在这些演讲中提到的那样: 来自 GopherCon EU 2018 的 Best Practices for Industrial Programming , GopherCon 2018: Kat Zien - How Do You Structure Your Go Apps 和 GoLab 2018 - Massimiliano Pippi - Project layout patterns in Go )。

这是一种常见的布局模式,但并不是所有人都接受它,一些 Go 社区的人也不推荐它。相关实例如下:

  • https://github.com/jaegertracing/jaeger/tree/master/pkg
  • https://github.com/istio/istio/tree/master/pkg
  • https://github.com/GoogleContainerTools/kaniko/tree/master/pkg
  • https://github.com/google/gvisor/tree/master/pkg
  • https://github.com/google/syzkaller/tree/master/pkg
  • https://github.com/perkeep/perkeep/tree/master/pkg
  • https://github.com/minio/minio/tree/master/pkg
  • https://github.com/heptio/ark/tree/master/pkg
  • https://github.com/argoproj/argo/tree/master/pkg
  • https://github.com/heptio/sonobuoy/tree/master/pkg
  • https://github.com/helm/helm/tree/master/pkg
  • https://github.com/kubernetes/kubernetes/tree/master/pkg
  • https://github.com/kubernetes/kops/tree/master/pkg
  • https://github.com/moby/moby/tree/master/pkg
  • https://github.com/grafana/grafana/tree/master/pkg
  • https://github.com/influxdata/influxdb/tree/master/pkg
  • https://github.com/cockroachdb/cockroach/tree/master/pkg
  • https://github.com/derekparker/delve/tree/master/pkg
  • https://github.com/etcd-io/etcd/tree/master/pkg
  • https://github.com/oklog/oklog/tree/master/pkg
  • https://github.com/flynn/flynn/tree/master/pkg
  • https://github.com/jesseduffield/lazygit/tree/master/pkg
  • https://github.com/gopasspw/gopass/tree/master/pkg
  • https://github.com/sosedoff/pgweb/tree/master/pkg
  • https://github.com/GoogleContainerTools/skaffold/tree/master/pkg
  • https://github.com/knative/serving/tree/master/pkg
  • https://github.com/grafana/loki/tree/master/pkg
  • https://github.com/bloomberg/goldpinger/tree/master/pkg
  • https://github.com/Ne0nd0g/merlin/tree/master/pkg
  • https://github.com/jenkins-x/jx/tree/master/pkg
  • https://github.com/DataDog/datadog-agent/tree/master/pkg
  • https://github.com/dapr/dapr/tree/master/pkg
  • https://github.com/cortexproject/cortex/tree/master/pkg
  • https://github.com/dexidp/dex/tree/master/pkg
  • https://github.com/pusher/oauth2_proxy/tree/master/pkg
  • https://github.com/pdfcpu/pdfcpu/tree/master/pkg
  • https://github.com/weaveworks/kured/tree/master/pkg
  • https://github.com/weaveworks/footloose/tree/master/pkg
  • https://github.com/weaveworks/ignite/tree/master/pkg
  • https://github.com/tmrts/boilr/tree/master/pkg
  • https://github.com/kata-containers/runtime/tree/master/pkg
  • https://github.com/okteto/okteto/tree/master/pkg
  • https://github.com/solo-io/squash/tree/master/pkg

如果你的应用程序项目真的很小,并且额外的嵌套并不能增加多少价值(除非你真的想要:-),那就不要使用它。当它变得足够大时,你的根目录会变得非常繁琐时(尤其是当你有很多非 Go 应用组件时),请考虑一下。

/vendor

应用程序依赖项(手动管理或使用你喜欢的依赖项管理工具,如新的内置 Go Modules 功能)。go mod vendor 命令将为你创建 /vendor 目录。请注意,如果未使用默认情况下处于启用状态的 Go 1.14,则可能需要在 go build 命令中添加 -mod=vendor 标志。

如果你正在构建一个库,那么不要提交你的应用程序依赖项。

注意,自从 1.13 以后,Go 还启用了模块代理功能(默认使用 https://proxy.golang.org 作为他们的模块代理服务器)。在here 关于它的信息,看看它是否符合你的所有需求和约束。如果需要,那么你根本不需要 vendor 目录。

国内模块代理功能默认是被墙的,七牛云有维护专门的的模块代理

服务应用程序目录

/api

OpenAPI/Swagger 规范,JSON 模式文件,协议定义文件。

相关实例:

  • https://github.com/kubernetes/kubernetes/tree/master/api
  • https://github.com/moby/moby/tree/master/api

Web 应用程序目录

/web

特定于 Web 应用程序的组件:静态 Web 资产、服务器端模板和 SPAs。

通用应用目录

/configs

配置文件模板或默认配置。

将你的 confdconsul-template 模板文件放在这里。

/init

System init(systemd,upstart,sysv)和 process manager/supervisor(runit,supervisor)配置。

/scripts

执行各种构建、安装、分析等操作的脚本。

这些脚本保持了根级别的 Makefile 变得小而简单(例如, https://github.com/hashicorp/terraform/blob/master/Makefile )。

相关示例。

  • https://github.com/kubernetes/helm/tree/master/scripts
  • https://github.com/cockroachdb/cockroach/tree/master/scripts
  • https://github.com/hashicorp/terraform/tree/master/scripts

/build

打包和持续集成。

将你的云( AMI )、容器( Docker )、操作系统( deb、rpm、pkg )包配置和脚本放在 /build/package 目录下。

将你的 CI (travis、circle、drone)配置和脚本放在 /build/ci 目录中。请注意,有些 CI 工具(例如 Travis CI)对配置文件的位置非常挑剔。尝试将配置文件放在 /build/ci 目录中,将它们链接到 CI 工具期望它们的位置(如果可能的话)。

/deployments

IaaS、PaaS、系统和容器编排部署配置和模板(docker-compose、kubernetes/helm、mesos、terraform、bosh)。注意,在一些存储库中(特别是使用 kubernetes 部署的应用程序),这个目录被称为 /deploy

/test

额外的外部测试应用程序和测试数据。你可以随时根据需求构造 /test 目录。对于较大的项目,有一个数据子目录是有意义的。例如,你可以使用 /test/data/test/testdata (如果你需要忽略目录中的内容)。请注意,Go 还会忽略以“.”或“_”开头的目录或文件,因此在如何命名测试数据目录方面有更大的灵活性。

相关示例。

  • https://github.com/openshift/origin/tree/master/test (test data is in the /testdata subdirectory)

其他目录

/docs

设计和用户文档(除了 godoc 生成的文档之外)。

有关示例,请参阅 /docs 目录。

/tools

这个项目的支持工具。注意,这些工具可以从 /pkg/internal 目录导入代码。

相关示例。

  • https://github.com/gohugoio/hugo/tree/master/docs
  • https://github.com/openshift/origin/tree/master/docs
  • https://github.com/dapr/dapr/tree/master/docs

/examples

你的应用程序和/或公共库的示例。

相关示例。

  • https://github.com/nats-io/nats.go/tree/master/examples
  • https://github.com/docker-slim/docker-slim/tree/master/examples
  • https://github.com/hashicorp/packer/tree/master/examples

/third_party

外部辅助工具,分叉代码和其他第三方工具(例如 Swagger UI)。

/githooks

Git hooks。

/assets

与存储库一起使用的其他资产(图像、徽标等)。

/website

如果不使用 Github 页面,则在这里放置项目的网站数据。

相关示例。

  • https://github.com/hashicorp/vault/tree/master/website
  • https://github.com/perkeep/perkeep/tree/master/website

不应该拥有的目录

/src

有些 Go 项目确实有一个 src 文件夹,但这通常发生在开发人员有 Java 背景,在那里它是一种常见的模式。如果可以的话,尽量不要采用这种 Java 模式。你真的不希望你的 Go 代码或 Go 项目看起来像 Java:-)

不要将项目级别 src 目录与 Go 用于其工作空间的 src 目录(如 How to Write Go Code 中所述)混淆。$GOPATH 环境变量指向你的(当前)工作空间(默认情况下,它指向非 windows 系统上的 $HOME/go)。这个工作空间包括顶层 /pkg, /bin/src 目录。你的实际项目最终是 /src 下的一个子目录,因此,如果你的项目中有 /src 目录,那么项目路径将是这样的: /some/path/to/workspace/src/your_project/src/your_code.go。注意,在 Go 1.11 中,可以将项目放在 GOPATH 之外,但这并不意味着使用这种布局模式是一个好主意。

好的开源项目架构示例

go-gin-api

image.png

k8s

image.png

参考链接

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python入门自学到精通需要看哪些书籍?

Python语言在近几年可以算得上如日中天,越来越火爆的同时,学习Python的人也越来越多了。对于不同基础的学习者来讲,学习的重点和方式也许会有差别,但是基础语法永远都是重中之重。在牢牢掌握基础知识的前提下,我们才能…

SAP ABAP 利用弹窗(POPUP)实现屏幕(DIALOG)快速开发

SAP ABAP 利用弹窗(POPUP)实现屏幕(DIALOG)快速开发 引言: 在 ABAP 开发中经常用到屏幕(DIALOG)开发,这通常都比较耗时。按复杂度可以分成复杂和简单两类屏幕开发,复杂的…

linux(乌班图)开发环境搭建

乌班图远程连接方法:安装openssh-server 和openssh-clientsudo apt-get -y install openssh-server openssh-client 设置允许root用户进行远程连接 方法一: /etc/ssh/sshd_config里面添加PermitRootLogin yes #重启 service ssh restart方法二&#xff1…

Pandas小白入门(一)---将value_counts的结果转为DataFrame

文章目录代码示例工作原理rename_axisreset_index各函数对于DataFrame下的应用其他应用quantile结果转为DataFrame代码示例 value_counts的结果是一个series,其index为原来列的值,value为值的个数。要将其转为DataFrame需要两个函数rename_axis和reset_…

为什么每个程序员都必须写博客

工作了好几年了,一直没写过技术类的博客,最近才开始尝试写一些技术类的博客。通过写博客的这段时间发现,写博客能够帮助我们快速成长已经提高我们学习的积极性,本文将和大家详细说说程序员写博客的好处。 🚀 一、加深对…

机器学习必会技能之微积分【一文到底】

机器学习必会技能 —— 微积分【一文到底】 文章目录机器学习必会技能 —— 微积分【一文到底】1 微积分的四类问题2 深入理解导数的本质3 深入理解复合函数求导4 理解多元函数偏导5 梯度究竟是什么?6 真正理解微积分6.1 直观理解6.2 理解微积分基本定理7 非常重要的…

NLP之文本分类项目(基于tensorflow1.14版本)

1.README.md:(查看项目整体结构以及各个部分作用) # Text Classification with RNN使用循环神经网络进行中文文本分类本文是基于TensorFlow在中文数据集上的简化实现,使用了字符级RNN对中文文本进行分类,达到了较好的效果。## 环境- Python 3 - TensorF…

Oracle项目管理之设施与资产管理Facilities and Asset (English)

目录 Maintenance Management Stand Alone or Integrated Facility Condition Assessment Space Management Lease Management Full Lease Expenses and Payment Management Transaction Management Asset Portfolio Management Portfolio Management Capabilities S…

改进二进制粒子群算法在配电网重构中的应用(Matlab实现)【论文复现】

目录 ​ 0 概述 1 配电网重构的目标函数 2 算例 3 matlab代码实现 0 概述 配电系统中存在大量的分段开关和联络开关,配电网重构正是通过调整分段开关和联络升大的组合状态来变换网络结构,用于优化配电网某些指标,使其达到最优状态。正常运行时,则通…

简单理解Vue的data为啥只能是函数

在学习vue的时候vue2只有在组件中严格要求data必须是一个函数,而在普通vue实例中,data可以是一个对象,但是在vue3出现后data必须一个函数,当时看着官方文档说的是好像是对象的引用问题,但是内部原理却不是很了解&#…

[附源码]Node.js计算机毕业设计高校教学过程管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

异常检测方法总结

在数据挖掘中,异常检测(英语:anomaly detection)对不匹配预期模式或数据集中其他项目的项目、事件或观测值的识别。 通常异常项目会转变成银行欺诈、结构缺陷、医疗问题、文本错误等类型的问题。异常也被称为离群值、新奇、噪声、…

1999-2020年各省农村综合数据

1999-2020年各省农村综合数据 1、时间:1999-2020年 2:来源:各省NJ、统计NJ、农村NJ 3、范围:包括31省 4、指标包括: 第一产业增加值占地区生产总值比重(%)、第一产业人员占就业人员比重&a…

scikit-learn 决策树入门实践 iris花分类

背景 为了了解sklearn的API,以及决策树的工作原理,本文以经典的花分类问题为例,编写代码并讲解。最后深入源代码查看其实现 关键词:决策树、基尼系数、决策树可视化、特征重要性。 代码案例 训练决策树 首先要准备数据集&#…

1.引入——如何创建Spring项目

目录 1.创建SpringBoot项目 1.未安装插件 2.安装插件 2.尝试着运行这个FirstApplication 3.Spring的核心——IOC(控制反转)/DI的讲解 1.相关概念: 2.什么是IOC,为什么要有IOC? 4.基于XML的方式,演示…

制造企业数字化车间MES系统方案

在市场经济越发严峻的局面下,现代制造业工厂越来越追求效率与精益生产管理,争相通过各种技术手段实现生产线上的现代管理,其中,可视化生产管理技术受到企业的关注,对MES系统也越来越重视。 MES系统解决的问题 1、条码…

094基于nodejs框架的学生作业管理系统vue

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 系统分为不同的层次:视图层(vue页面…

【C语言数据结构(基础版)】第三站:链表(二)

目录 一、单链表的缺陷以及双向链表的引入 1.单链表的缺陷 2.双向链表的引入 3.八大链表结构 (1)单向和双向 (2)带头和不带头 (3)循环和不循环 (4)八种链表结构 二、带头双向…

牛掰,阿里技术人刷了四年LeetCode才总结出来的数据结构和算法手册

时间飞逝,转眼间毕业七年多,从事 Java 开发也六年了。我在想,也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Java 面试…

ssm+Vue计算机毕业设计校园疫情防控管理软件(程序+LW文档)

ssmVue计算机毕业设计校园疫情防控管理软件(程序LW文档) 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项…