我对 Golang 比较陌生,在以前的项目中使用过 Node.JS 和 AngularJS,并且在 Golang 对项目结构非常固执己见时遇到了麻烦。我们的 Go 代码存在于一个存储库中,该存储库还包含我们的 HTML、CSS 和 JS 代码,因此我们的“Web UI”是一个单一的检出。Go 服务器提供静态页面以让 AngularJS 完成繁重的客户端,并提供相当复杂的 RESTful API 用于与一块嵌入式硬件进行交互。我们在 Go 服务器代码中使用本地包含来解决代码实际上不在 GOPATH 中的事实。文件夹结构大致如下(子文件夹未显示):
/ <-- repo root, checked out wherever you want (not in GOPATH)
fonts/
scripts/ <-- all the AngularJS code
server/ <-- all the Go code
styles/
views/ <-- all the HTML code
我现在正在使用 go-swagger 库从我们的 Go 服务器代码中的注释生成一个 Swagger 规范,因为 Swagger UI 为与我们的服务器 API 交互提供了一个方便的 UI。但是,我发现如果您的代码不在 GOPATH 中,则无法使用 go-swagger 解析器的很大一部分。如果我将服务器文件夹复制到 GOPATH src 目录并在那里运行它,我可以让 go-swagger 工作,但我显然不想在每次更新 API 或添加新路由时都这样做。
我想我将不得不对我们的文件夹结构或我们的构建过程进行一些更改,但我想了解最合乎逻辑的前进方式。理想情况下,我们会在 Gruntfile 中添加一个新任务,通过调用 go-swagger 来生成 swagger 规范,并将该规范复制到 Swagger UI 的默认位置,以便我们可以在每次构建时提供正确的 API 规范。我了解该任务应该如何运作,但它不适用于我们当前的项目结构。所以:
- 我们是否应该将 Go 服务器代码分解为我们在 GOPATH 中签出的自己的存储库?我们还有其他工具(如 ffjson)也对我们存在于 GOPATH 之外的 Go 代码不满意,所以也许这值得我们努力更新我们的构建过程来处理。
- 有没有办法修改 GOPATH(或像 PATH 一样添加到它),以便 go-swagger(和 ffjson)可以在我们现有的 repo 结构中工作?如果可能的话,这似乎是最简单的路径。我已经尝试在 GOPATH 中检查我们的“UI”存储库,但最初并没有奏效(如果我更新我们的导入以使用从 repo 根目录到服务器文件夹的任意路径,它可能会起作用)。
- 完全不同的东西?正如我所说,我对 Go 还很陌生,而且当我加入这个项目时,这个项目已经存在了几年,所以我还不熟悉 Go 的来龙去脉。