如果在一个 git 仓库中存储了多个项目,那么这个仓库实际充当了一个工作空间(Workspace),而不是项目的根目录。因此本项目提供一个用于同时管理多个项目的解决方案。
此解决方案参考了一些常用语言使用的项目布局和约定,并添加了额外的约束,以减少预期之外的冲突。
因为各个编程语言使用的术语各不相同,所以用词可能会出现混乱,请按照对应的编程语言来理解。
不约定使用什么方案构建项目,可以自由地选择 CMake、meson、XMake 等构建工具,也可以使用 Shell、Python 等脚本语言,但此处以 meson 为例。
以下编程语言待提供
- JavaScript / TypeScript (Node.JS)
- Java(maven)
- Python (Python3)
为了便于阅读,此处没有按照字母顺序排列。
bin为编译得到的目标程序预留{project}项目名称{executable-file}可执行文件名,可能还有其他相关文件
build一个临时目录,用于编译项目docs存储项目文档include总 include 目录,包含项目中所有以 C/C++ 头文件形式提供的接口{module}模块名称common.h / common.hpp提供模块中最基础的定义,如声明公用宏、定义基础类型等a.h / a.hpp头文件b子模块,用于对头文件分类管理c.h / c.hpp子模块头文件
{c-project}一个 C 项目名称src用于存放源代码文件main.cmain 函数所在的文件
meson.build构建脚本文件
{cpp-project}一个 C++ 项目名称src用于存放源代码文件main.cppmain 函数所在的文件
meson.build构建脚本文件
{go-project}Golang 项目名称cmd用于存放 main 包{go-project}main 包,此目录应与项目名称相同main.gomain 函数所在的文件
internal用于存放源代码文件不要使用 pkg 目录,因为在Go项目标准布局1中 /pkg 用于存放外部应用程序可以使用的库代码,如果项目被外部引用,那它应为一个独立的 Go module,而不仅是作为项目的一个包pkgvendor存储在本地的外部依赖,按需使用 go vendor 功能meson.build如果需要,可以提供构建脚本文件go.modgo 模块文件,格式 {project-url}/{go-project}go.sumgo 模块文件
{rust-project}Rust 项目(包)名称src用于存放源文件main.rsmain 函数所在的文件
Cargo.tomlCargo.lockbuild.rs如果需要引入非 Rust 代码,可以提供 build.rs 文件meson.build如果需要,可以提供构建脚本文件
shared用于存放多个项目共用的代码。名称不应与上级目录中的项目冲突,这里可以互相引用,但是应尽量不要出现互相依赖{c-module}一个 C/C++ 模块,应当唯一对应 include 中的一个目录a.c / a.cppbc.c / c.cpp
meson.build构建脚本文件
{rust-library}一个库类型的 Rust crate,使用cargo new shared/{rust-library} --lib创建,在 Cargo.toml 文件中,并不会出现shared/前缀srclib.rscrate 的根a.rsbc.rs
build.rs如果需要引入非 Rust 代码,可以提供 build.rs 文件Cargo.tomlCargo.lockmeson.build如果需要,可以提供构建脚本文件
{go-module}一个 Go 模块api接口声明pkg提供外部使用的代码internal模块私有代码go.modgo 模块文件,格式 {project-url}/shared/{go-module}go.sumgo 模块文件
modules通过 git summodule 引入的外部模块{external-git-module}外部 git submodule
script非核心项目代码的脚本文件docker存放 Dockerfile 文件docker-compose存放 Docker compose 文件Cargo.toml如果此项目包含了 Rust 代码,应当在根目录提供Cargo.toml,声明其是一个 Rust packege。Cargo.lock不要在根目录提供 Golang 模块声明,因为 Golang 的相关工具在处理这种项目时可能会出现问题go.mod因为没有 go.mod 文件,所以也不需要 go.sumgo.sumgo.work如果需要,可以使用 go.work 管理各个 go 模块meson.build构建脚本文件