用于Web应用程序的Go Lang文件夹结构

时间:2016-04-09 20:59:21

标签: design-patterns go

如你所知,Go是OOP imo的一种现代方法,有一些很棒的东西,比如强迫你使用构图而不是继承。我只是想了解如何在文件夹和包结构方面设计一个编写良好的代码。

我只是想知道下面可以看到这个React类似的方法 - 将app作为组件划分到不同的包可以工作吗?

或者你可以给我一个例子,链接,想法在web api的文件夹/打包方面有一个好的结构。 Go将只是我的开源项目背景中的api,在客户端我计划有一个单页的React应用程序btw。

非常感谢,

enter image description here

2 个答案:

答案 0 :(得分:2)

我倾向于将我的应用程序构建为: $GOPATH/github.com/yourname/projectname/ cmd/ app1/ main.go app2/ main.go db/ 001_initial_schema.sql 002_add_timestamps.sql ... etc ... lib/ lib1/ lib2/ html/ ..all the html stuff.. 其中app1 / app2是命令行应用程序。通常它只是一个应用程序(您的Web服务器)。

lib / *就是你所拥有的任何隔离的功能。

通常,我从cmd / app1开始,然后在项目变得足够复杂时扩展到lib。

制作静态文件服务器(假设你有),使用" html"作为目录。

对于数据库迁移,我使用了一个非常简单的迁移器,因为我发现其他迁移器太复杂/太大了。

Here's the code我在我的项目中使用。
我想把它变成一个真正的库,但我很确定这是postgresql特有的,因为它假设DDL是事务性的。

使用这种结构,你可以简单地(从项目根目录):

go install ./... && app1

构建/测试您的应用。

如果您希望部署到Heroku,这个结构也会自然地工作,因为heroku将您的工作目录设置为项目根目录。

答案 1 :(得分:2)

标准 Go 项目布局

GitHub 上有一个拥有很多星星的 Repo(撰写本文时为 22k) 这种方法实际上非常完整,但对于较小的项目来说可能有点矫枉过正。

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

转到目录(基本)

<头>
文件夹 说明
/cmd 该项目的主要应用。
/内部 私有应用程序和库代码。
/pkg 可供外部应用程序使用的库代码。
/供应商 应用程序依赖项(手动管理或由您最喜欢的依赖项管理工具管理,例如新的内置 Go Modules 功能)。

服务应用目录

<头>
文件夹 说明
/api OpenAPI/Swagger 规范、JSON 架构文件、协议定义文件。

Web 应用程序目录

<头>
文件夹 说明
/web Web 应用程序特定组件:静态 Web 资产、服务器端模板和 SPA。

常用应用目录

<头>
文件夹 说明
/configs 配置文件模板或默认配置。
/init 系统初始化(systemd、upstart、sysv)和进程管理器/主管(runit、supervisord)配置。
/scripts 执行各种构建、安装、分析等操作的脚本。
/build 打包和持续集成。
/部署 IaaS、PaaS、系统和容器编排部署配置和模板。
/测试 额外的外部测试应用和测试数据。

其他目录

<头>
文件夹 说明
/docs 设计和用户文档(除了您的 godoc 生成的文档)。
/工具 此项目的支持工具。
/示例 您的应用程序和/或公共库的示例。
/third_party 外部辅助工具、分叉代码和其他 3rd 方实用程序(例如 Swagger UI)。
/githooks Git 钩子。
/assets 与您的存储库一起使用的其他资产(图像、徽标等)。
/网站 如果您不使用 GitHub 页面,这里是放置项目网站数据的地方。