古塞夫基金会
这是 Galaxy Unlimited 平台的主要单一存储库。这里包含的软件是库以及派生服务和应用程序的集合,本质上都是相当通用的。这些库的首要目的是充当快速开发应用程序和服务的 C++ 工具箱。一些此类工具/应用程序/服务也包含在同一个单一存储库中。
请注意,主平台模块故意不强制要求较新版本的 C++,以允许它们在没有现代编译器可用的情况下使用。由于这个原因,任何较新语言功能的使用都倾向于通过宏来处理,以便代码仍然可以使用较旧的编译器进行编译。
关于名字
GUCEF 一度代表“Galaxy Unlimited Client Engine Framework”。它是具有独立 GUCE 和 GU 软件堆栈层的多层堆栈的一部分。 GUCE 代表“Galaxy Unlimited Client Engine”。 GUC 代表“Galaxy Unlimited Client”。 GU仍然是“Galaxy Unlimited”的缩写。此时GUCEF和GUCE已经合并在一起,并且GUC和GU的一些部分也被合并。许多新开发不再关注客户端,而是关注支持服务和后端开发。
一点历史
多年来,作者创建了各种代码库并吸取了教训。缓慢但肯定地出现了一个共同的代码核心,并开始有机增长。由于数据保留问题和年轻备份实践,最初的通用核心代码库多次部分丢失,并进一步受到缺乏财务资源的限制。各种存储库合并在一起,结合各种部分备份来创建 GUCEF 存储库的第一个版本。第一个版本在 SourceForce 上找到了它的公共主页。最初使用CVS作为版本控制系统,随后是SVN,后来又是Git。当考虑迁移到 Git 时,还考虑了开源存储库的新家。由于开源社区越来越受欢迎,GitHub 赢得了成为 GUCEF 和一些相关存储库的新家的机会,并保留至今。
关于作者
除了依赖项之外,此存储库中的几乎所有代码都是由 Dinand Vanvelzen 编写的。 Dinand 在 20 世纪 80 年代小时候就开始编程,为 MSX 编写汇编代码,MSX 是飞利浦设计的 PC 概念。后来在 20 世纪 90 年代,RAD 编程原理通过 Borland Delphi 成为人们的新爱好,随后是 Borland C++ Builder。此时,作者开始了软件工程黑暗艺术的专业教育。在应用程序编程和后端/底层编程之间采用了双重策略,这在当时是不同程度的。在此期间,您在此存储库中找到的代码库随着概念的融合和发展而不断增长和发展。在 2000 年代,作者的主要关注点是可视化,主要是 3D 图形,无论是专业的还是出于求知欲,都进入了这个存储库。移民到美国并组建家庭使新的发展缓慢了好几年,直到个人情况稳定后才开始回升。正是在这个阶段,年轻的理想主义开始让位于实用主义。从专业角度来看,介入医疗保健领域让位于企业医疗保健,而企业医疗保健后来又让位于金融部门。随后的新发展务实地关注了作者职业生涯中的共同需求,并混合了偶然的奇怪项目作为达到目的的手段。
单一回购细分
- /platform :主要平台模块具有具体的可移植功能和通过插件利用附加功能的接口
- /plugins :这里有各种插件,可以选择用于扩展平台功能
- /projects :这有用于生成构建项目的脚本等
- /common/bin :这有项目的二进制输出
- /dependencies :顾名思义,该文件夹包含插件使用的各种依赖库,而不是直接由平台库使用的依赖库。
- /tests :顾名思义,它保存一些专用的测试代码
如何为我的 IDE 生成项目
支持 IDE 项目/解决方案文件的主要方法是通过 CMake。 CMake 文件本身几乎都是通过此存储库中包含的名为“ProjectGenerator”的工具自动生成的。 ProjectGenerator 使用最少的 ModuleInfo.xml 文件对存储库中的文件进行分析以识别模块,从那里派生出所有需要的路径并生成所需的文件。这个工具还可以为其他工具链输出中间件文件,而不仅仅是 CMake。还包括 premake 4 和 premake 5 以及 android make 文件,但它们目前更新不那么频繁,因此您的情况会有所不同。
在大多数情况下,您需要先转到 /projects/CMake 生成相关的 IDE 文件。在该文件夹中,您将看到各种名称很长的脚本。在某些时候,这将根据 TODO 列表进行重构,但目前方案如下:
例如,您有一个类似“RunCMake_Shared_CodeBlocks_Unix_Debug_pubsub2pubsub.sh”的脚本文件
- RunCMake_ :第一段只是出于历史原因将其与文件夹中的其他文件区分开来,请忽略。
- Shared_ :此段主要与 CMake 相关,其中传递的默认模块构建方法将是“动态”(dll/so)与静态(.lib/.a)
- CodeBlocks_ :此段包含您希望为其生成项目文件的 IDE 的名称,在本例中为 Code Blocks IDE
- Unix_:该段表示目标平台。某些 IDE 支持多个目标平台。
- Debug_ :该段可能不适用于所有脚本,这取决于生成器的功能。对于某些生成器,需要从一开始就为调试或发布版本创建项目文件本身。对于 Visual Studio 来说,这不是必需的
- pubsub2pubsub.sh :该段表示整个 mono-repo 上逻辑视图的主要目标。在本例中,服务为 pubsub2pubsub。
换句话说,格式为:“RunCMake_Shared/Static_IDE to use_OS Target_Debug/Release_Target name.Executable script extension”
在 Windows 上,当您运行上述脚本和类似脚本时,它也会触发 ProjectGenerator 的运行。这只是为了使流程更加简单,因为通常提交的 CMake 文件已经是最新的,因此通常可以删除并跳过此步骤。在此潜在步骤之后,将调用 CMake 来处理构建文件的生成。此类文件写入/common/bin。该存储库遵循临时输出文件不应与代码混合的思想。如果您因任何原因遇到陈旧/损坏的输出文件(磁盘问题?)的麻烦,您总是可以删除 /common/bin 下的整个文件夹结构
包含的平台库
- gucefMT:具有多线程编程原语的库。可能会在某个时候被合并到 gucefCORE 中。
- gucefCORE:具有平台上构建功能运行方式核心功能的库,例如插件/日志记录/指标/事件/等系统
- gucefIMAGE:构建利用数字图像的软件时使用的可选库
- gucefVFS:构建软件时使用的可选库,该软件除了基本访问之外还执行更复杂的文件系统样式 I/O。 VFS = 虚拟文件系统。
- gucefCOMCORE:构建执行基本网络的软件时使用的可选库
- gucefCOM:构建执行网络并使用相当行业标准功能(例如 StatsD)的软件时使用的可选库
- gucefWEB:构建执行 Internet/Web 风格网络的软件时使用的可选库
- gucefPUBSUB:构建使用发布/订阅概念的软件时使用的可选库
- gucefGUI:需要 GUI 时使用的可选库。主要关注的是渲染上下文中的 GUI,而不是操作系统本机 GUI
- gucefINPUT:需要支持人工输入设备时使用的可选库。
- gucefLOADER:动态加载多个GUCEF平台版本时使用的可选库
- gucefPATCHER:当需要支持自动修补功能与最终用户手动下载更新时使用的可选库
- gucefMATH:通过 OO 概念执行数学计算时使用的可选库
- gucefKAITAI:利用 Kaitai 模式解释二进制格式时使用的可选库
包含的平台插件
- dstorepluginPARSIFALXML:gucefCORE 插件:添加对 XML 的 DStore (DataNode) 编解码器支持。通过 GUCEF 代码写入并通过 ParsifalXML 依赖库读取
- dstorepluginJSONPARSER:gucefCORE 插件:添加对 JSON 的 DStore (DataNode) 编解码器支持。使用 json-parser 和 json-builder 依赖库
- dstorepluginYAML:gucefCORE 插件:添加对 YAML 的 DStore (DataNode) 编解码器支持。使用libyaml依赖库
- codecspluginZLIB:gucefCORE 插件:添加对 zlib/gzip/deflate/crc32/adler32 的编解码器支持
- codecspluginSTBRUMMEHASH:gucefCORE 插件:添加对 CRC32/MD5/SHA1/SHA3/SHA256/Keccak 的编解码器支持
- imgpluginDEVIL:gucefIMAGE 插件:添加源自 DEVIL 图像依赖库的数字图像管理功能。支持各种图像编解码器。
- imgpluginFLIC:gucefIMAGE 插件:添加对 FLIC 格式的图像编解码器支持
- imgpluginFreeImage:gucefIMAGE 插件:添加源自 FreeImage 图像依赖库的数字图像管理功能。支持各种图像编解码器。
- imgpluginITV:gucefIMAGE 插件:添加对逆向工程 ITV 格式的图像编解码器支持
- vfspluginAWSS3:gucefVFS 插件:添加 VFS 后端以安装和使用 AWS S3 作为虚拟文件系统的一部分
- vfspluginDVP:gucefVFS 插件:过时的 VFS 后端,用于安装和使用 DVP 存档文件作为虚拟文件系统的一部分
- vfspluginITV:gucefVFS 插件:VFS 后端,用于安装和使用逆向工程 ITV 存档文件作为虚拟文件系统的一部分
- vfspluginVP:gucefVFS 插件:VFS 后端,用于安装和使用“Violation Pack”存档文件作为虚拟文件系统的一部分,例如游戏 Decent 和 FreeSpace 使用的虚拟文件系统
- vfspluginZIP:gucefVFS 插件:VFS 后端,用于安装和使用 zlib 兼容存档文件作为虚拟文件系统的一部分,例如 .gz 和 .zip
- inputdriverDIRECTINPUT8:gucefINPUT 插件:添加输入驱动程序,用于通过 Microsoft DirectInput 8 进行输入设备交互
- inputdriverMSWINMSG:gucefINPUT 插件:添加输入驱动程序,用于通过 Microsoft Windows Win32 API 消息进行输入设备交互
- inputdriverNANDROID:gucefINPUT 插件:添加输入驱动程序,用于通过本机 Android API 进行输入设备交互
- inputdriverOIS:gucefINPUT 插件:通过 OIS 依赖库添加用于输入设备交互的输入驱动程序
- inputdriverXWINMSG:gucefINPUT 插件:通过 Linux 的 X-Windowing 消息系统添加用于输入设备交互的输入驱动程序
- pubsubpluginAWSSNS:gucefPUBSUB 插件:为 AWS 的 SNS 服务添加一个 pub-sub 概念兼容的后端。使用 AWS C++ 开发工具包。
- pubsubpluginAWSSQS:gucefPUBSUB 插件:为 AWS 的 SQS 服务添加一个 pub-sub 概念兼容的后端。使用 AWS C++ 开发工具包。
- pubsubpluginKAFKA:gucefPUBSUB 插件:为 Kafka 流添加一个 pub-sub 概念兼容的后端。使用 RdKafka 依赖库。
- pubsubpluginMSMQ:gucefPUBSUB 插件:为 MSMQ 添加一个 pub-sub 概念兼容的后端。使用Windows操作系统,需要安装MSMQ子系统。
- pubsubpluginREDISCLUSTER:gucefPUBSUB 插件:为 Redis 流添加一个 pub-sub 概念兼容的后端。使用 redis++ 和hiredis 依赖项。
- pubsubpluginSTORAGE:gucefPUBSUB 插件:添加一个 pub-sub 概念兼容的后端,允许与 VFS 及其功能轻松交互
- pubsubpluginUDP:gucefPUBSUB 插件:为基本 UDP 添加一个 pub-sub 概念兼容的后端
- pubsubpluginWEB:gucefPUBSUB 插件:为 HTTP/REST/WebSockets 等 Web 概念添加一个 pub-sub 概念兼容的后端
- ProjectGenDependsFilter:ProjectGen 插件:允许根据 dependent.exe 工具输出报告过滤存储库中的库
- ProjectGenVSImporter:ProjectGen 插件:导入 Visual Studio 项目文件以生成新存储库的 ModuleInfo.xml 起点
- comcorepluginDBL:gucefCOMCORE 插件,尝试提供来自 Myricom DBL 网络驱动程序的信息
- comcorepluginGEOOSM:gucefCOMCORE 插件,添加了基于开放街道地图的地理位置查找功能
包含服务
- UdpViaTCP:桥接服务,通过 TCP 段传输 UDP 流量。将被 pubsub2pubsub 取代。
- udp2kafka:适配器服务,允许 UDP 流量进入 Kafka 流。将被 pubsub2pubsub 取代。
- udp2redis:适配器服务,允许 UDP 流量进入非集群 Redis 的 Redis 流。将被 pubsub2pubsub 取代。
- udp2rediscluster:适配器服务,允许 UDP 流量进入集群 Redis 的 Redis 流。将被 pubsub2pubsub 取代。
- ProcessMetrics:获取目标进程指标的代理服务。旨在作为高频性能计数器等的有针对性的轻量级替代品
- redisinfo:监控服务,使用Redis协议获取Redis集群的信息,并将这些信息作为指标公开进行广播
- pubsub2storage:适配器服务,在消息传递范例和存储之间进行更普遍的转换。将被 pubsub2pubsub 取代。
- pubsub2pubsub:适配器服务,可以在不同的消息传递范例之间进行更普遍的转换。将取代许多其他适配器服务。
- FilePusher:代理服务,用于监视文件系统中的某些文件并将它们推送到 VFS 目标,例如 AWS S3。
- FileSorter:自动对文件进行排序的代理服务。例如,可以方便地对数字图片和视频存档进行初始排序。
- GucefLogService:可以接受通过网络连接传输的 GUCEF 平台日志的服务。针对我们无法拥有/访问本地日志的情况
- ServerPortExtender:用于反转应用程序服务器端口的入站/出站连接启动的服务,从而绕过仅限出口的限制
- UdpTransformer:采用入口 UDP 并执行简单转换然后重新传输的服务
- MsmqMetrics:代理服务,收集有关 MSMQ 队列的信息,并随后收集和传输所述队列的指标
包含的工具
- ProjectGenerator:自动生成各种项目/模块文件以及同一单一存储库的不同逻辑视图的工具
- DCSBruteInstaller:利用某些硬件和该软件的组合来暴力破解 DCS 家庭报警面板中的代码的工具
- itvExporter:经典游戏中包含的资产的逆向工程导出工具
- GucefArchiver:利用 VFS 及其插件的基本归档工具
- HDFiller:顾名思义,它会填充您的硬盘。用于测试场景。
- PubSubStorageTool:操作 pubsub 存储插件生成的存储文件的工具
包含的杂项库
- MemoryLeakFinder:动态加载的平台帮助程序库,可在 GUCEF 平台功能的帮助下追踪内存泄漏
- ProjectGen:包含 ProjectGenerator 工具的所有逻辑的库。它支持插件来扩展功能。
待办事项列表
- 短期:添加平台原生的基本 websocket 支持
- 短期:为编解码器添加适当的参数支持
- 短期:添加 StringView 支持
- 短期:完成 pubsub2pubsub 'web' 插件的初始通过
- 短期:完成 pubsub2pubsub 'aws sns' 插件的初始通过
- 短期:完成 pubsub2pubsub 'aws sqs' 插件的初始通过
- 短期:添加配置驱动的 CodecChain 类
- 中期:修复 GitHub CI 集成。自动构建触发器链接已损坏。
- 中期:添加 DataNode 架构系统
- 中期:添加配置驱动的消息转换引擎
- 中期:添加 AWS Lambda 支持
- 中期:添加 Utf16 和 Utf32 支持
- 中期:对所有静态字符串引用使用 StringView 而不是 String
- 中期:将 ProjectGenerator 变成可以作为后台服务运行的东西
- 中期:通过 ProjectGenerator 完成 GitHub Actions 支持
- 中期:通过 ProjectGenerator 添加 GitLab CI 支持
- 中期:完全重命名平台源文件,使其全部具有模块前缀
- 中期:删除死代码,作为单一存储库中包含的项目更大的振兴工作的一部分。确定其中包含的哪些其他应用程序值得保存。
- 中期:使用每个线程预分配的输出缓冲区为日志系统添加流支持作为优化
- 中期:重新创建平台控制台客户端功能
- 中期:为受支持的平台添加本机安全套接字支持
- 长期:添加 Web 组装支持
- 长期:通过 ProjectGenerator 添加 Jenkins CI 支持
- 有一天:弃用/撤消类的经典 MFC 样式“C”前缀。这将是一个巨大的改变,打破一切,这就是为什么它还没有发生。
- 正在进行:考虑过多的约束,评估更新各种依赖项的需要
- 正在进行中:完善日志记录/指标
- 正在进行中:添加更多 javadoc 格式(doxygen 兼容)文档