Sese Framework
简介
这是一个跨平台的、用于基础组件开发的框架,一定程度上作为标准库的补充使用。定位上类似于 Boost
、folly
之于标准库。项目使用 C++ 20 标准,引入了 vcpkg 作为包管理器帮助我们简化依赖项管理问题。
示例
内建日志器
现代的格式化方式
++
template<>
struct Formatter<Point> {
bool parse(
const std::string &) {
return true; }
void format(FmtCtx &ctx,
const Point &p) {
ctx.builder <<
fmt(
"({},{})", p.x, p.y);
}
};
}
Point point{1, 2};
2024-06-27T01:43:05.571Z I main.cpp:7 Main:10376> hello world
2024-06-27T01:43:05.572Z I main.cpp:8 Main:10376> a + b = 3
2024-06-27T01:43:05.572Z I main.cpp:9 Main:10376> point (1,2)
类 C 的格式化方式
++
#define SESE_C_LIKE_FORMAT
2024-05-15T15:54:48.296Z I main.cpp:8 Main:7116> hello world
2024-05-15T15:54:48.296Z W main.cpp:9 Main:7116> error End of file
HTTP 控制器
++
#include <sese/service/http/HttpServer_V3.h>
SESE_CTRL(MyController, std::mutex mutex{};
int times = 0) {
SESE_URL(timers, RequestType::GET,
"/times") {
auto &resp = ctx.getResp();
times += 1;
auto message = "timers = '" + std::to_string(this->times) + "'\n";
resp.getBody().write(message.data(), message.length());
};
SESE_URL(say, RequestType::GET,
"/say?<say>") {
auto &resp = ctx.getResp();
auto words = req.get("say");
auto message = "you say '" + words + "'\n";
resp.getBody().write(message.data(), message.length());
};
}
跨进程通讯
++
while (true) {
auto messages = channel->read(1);
if (messages.empty()) {
continue;
}
for (auto &&msg: messages) {
if (msg.getDataAsString() == "Exit") {
goto end;
}
}
}
end:
return 0;
channel->write(1, "Hello");
channel->write(2, "Hi");
channel->write(1, "Exit");
构建
对于开发者/贡献者
- 配置开发环境
对于 Windows 用户,请安装并配置 vcpkg 到目标机器上。
对于非 Windows 用户,vcpkg 同样是可用的。但同时你可以选择使用原生的系统依赖管理工具安装相应依赖。我们提供了几个预设的安装脚本。
sudo ./scripts/install_ubuntu_deps.sh
sudo ./scripts/install_fedora_deps.sh
./scripts/install_darwin_deps.sh
- 编译选项
如果你配置好了 vcpkg,只需设置工具链文件 即可完成依赖配置。
如果你使用系统依赖管理工具,那么你需要在按完成对应依赖后,手动添加 SESE_USE_NATIVE_MANAGER
编译选项。
我们定义了一些 options 用于启用或关闭部分功能,具体可以参照以下的类似格式:
https://github.com/libsese/sese/blob/4cd74389d7105b71c632070c775a727be8ee413d/CMakeLists.txt#L8-L16
- 编译
配置完成编译选项只需要常规构建即可,例如:
cmake --build build/linux-debug -- -j 4
对于普通使用者
对于普通使用者,我们推荐使用 vcpkg 导入此依赖,可以参考我们的模板项目配置你的项目:
- 警告
- 项目也可以作为普通项目安装在普通机器上,但这不是推荐的做法,也无法得到支持, 如果你想这么做可以参考
构建
> 对于开发者/贡献者
中关于系统依赖管理工具的内容。
主要工作是编写项目的依赖配置文件,例如:
vcpkg.json
{
"dependencies": [
"sese"
]
}
- 重要事项
- 自内建库基线
14b91796a68c87bc8d5cb35911b39287ccb7bd95
之后,sese 已进入内建列表。 在此之前,你需要多编写一个配置文件用于导入我们的私有注册表,就像这样:
vcpkg-configuration.json
{
"default-registry": {
"kind": "git",
"repository": "https://github.com/microsoft/vcpkg.git",
"baseline": "c8696863d371ab7f46e213d8f5ca923c4aef2a00"
},
"registries": [
{
"kind": "git",
"repository": "https://github.com/libsese/vcpkg-registry.git",
"baseline": "73268778d5f796f188ca66f71536377b171ee37e",
"packages": [
"sese"
]
}
]
}
如果你没有使用 vcpkg,上述步骤是不必要的。
测试
使用了 googletest 作为了测试框架,测试的详细信息可以从 github actions 中查看,包括各个平台的测试结果和 linux 的测试覆盖率等内容。
- 本地测试
如果你需要在本地运行完整测试,那么你可能需要注意关于数据库方面的测试,这需要一些额外的服务和配置支撑。
https://github.com/libsese/sese/blob/4cd74389d7105b71c632070c775a727be8ee413d/.github/workflows/ubuntu-22.04-apt.yml#L14-L34
https://github.com/libsese/sese/blob/4cd74389d7105b71c632070c775a727be8ee413d/.github/workflows/ubuntu-22.04-apt.yml#L45-L53
https://github.com/libsese/sese/blob/4cd74389d7105b71c632070c775a727be8ee413d/.github/workflows/ubuntu-22.04-apt.yml#L72-L75
docker-compose -f ./docker/docker-compose.yml up -d
sqlite3 build/db_test.db < scripts/sqlite_dump.sql
- 生成覆盖率测试报告
需要安装 gcovr,可以选择 pip 安装或者使用系统包管理器安装。
mkdir -p build/coverage/html
gcovr
- 注解
- 生成覆盖率测试数据首先需要设置一些额外的编译选项来生成例如 gcov 格式的测试数据,例如 GCC:
https://github.com/libsese/sese/blob/4cd74389d7105b71c632070c775a727be8ee413d/.github/workflows/ubuntu-22.04-apt.yml#L75
文档
文档将会随着主线的更新而自动更新到 github pages 上。
文档内容将从代码注释中自动生成,docs 目录实际存放构建文档所需的部分资源。
贡献者
许可证