【发布时间】:2014-06-18 12:42:58
【问题描述】:
我目前的任务是在我们的内部库方面尝试改进我们公司的版本控制实践。我已经阅读了 Semantic Versioning 2.0.0,这对于我们当前的问题来说似乎是一个非常好的、简单和优雅的解决方案,因为我们当前的版本控制实践(例如 library_v01)并没有真正告诉我们每个库版本的太多信息。
理想情况下,应用程序会在编译时检查正在使用的库的版本,以便在部署和/或测试之前发现任何不匹配的情况。我们的应用程序是用 Visual Studio 编写的,我们很快就会升级到 C++11 编译器友好的 VS2013,这就是为什么我的第一个想法是使用 static_asserts 以便在编译时检查版本,例如:
// Defined in library code and accessible by applications
struct LibraryVersion {
static const unsigned int LIB_VERSION_MAJOR = 1;
static const unsigned int LIB_VERSION_MINOR = 0;
static const unsigned int LIB_VERSION_PATCH = 0;
}
// Application code
static const unsigned int EXPECTED_LIB_VERSION_MAJOR = 1;
static const unsigned int EXPECTED_LIB_VERSION_MINOR = 0;
static const unsigned int EXPECTED_LIB_VERSION_PATCH = 0;
void lib_version_check() {
static_assert(LibraryVersion::LIB_VERSION_MAJOR == EXPECTED_LIB_VERSION_MAJOR, "Error Major");
static_assert(LibraryVersion::LIB_VERSION_MINOR == EXPECTED_LIB_VERSION_MINOR, "Error Minor");
static_assert(LibraryVersion::LIB_VERSION_PATCH == EXPECTED_LIB_VERSION_PATCH, "Error Patch");
}
此外,最好在库 prop 文件中包含某种预处理器定义,该文件可用于包含路径,以便每个应用程序始终包含正确的库文件,例如
$(LIB_DIR)="C:\Libs\"
$(LIB_VERS)="v1.0.0"
Include_Path = $(LIB_DIR)\$(LIB_VERS);
文件结构类似于:
C:\Libs\v1.0.0\include\...
C:\Libs\v1.0.1\include\...
C:\Libs\v1.0.2\include\...
C:\Libs\v1.2.0\include\...
然而,这对我来说似乎不是最优雅的解决方案,并且必须跟踪两个版本变量(预处理器值和代表 MAJOR、MINOR 和 PATCH 版本的无符号整数)似乎有点多。
所以基本上我想问一下其他人是否遇到过类似的事情,他们是否对什么是优雅的解决方案有任何见解,或者使用上述解决方案是否有任何我可能没有想到的陷阱的?也许具有像上述那样的文件结构是有问题的和/或有更简单的方法?对于任何反馈,我们都表示感谢。非常感谢。
【问题讨论】:
标签: c++ design-patterns c++11 shared-libraries