语义版本控制:小变化还是大变化?
Semantic versioning: minor or major change?
在 semantic versioning the general rule is to increase the minor number only when backwards compatible functionalities are introduced, otherwise the major number must be increased instead. The same approach 中,但算法不同,由 libtool 使用。
我有一个问题,关于什么是向后兼容的更改,什么不是。
假设我写了一个库,这个库的 public 头文件包含一个名为 foo
的数据类型的 typedef
。在版本 1.0.0 中,这个 typedef
看起来像这样:
typedef struct foo_t {
int x;
int y;
} foo;
然后我决定更改数据类型,在下一个版本中将如下所示:
typedef struct foo_t {
int x;
int y;
int z;
} foo;
我只在结构中添加了一个字段foo_t
。这似乎是一个向后兼容的更改,但是上面的结构现在 事实上 是另一个结构。我所做的并不是引入一个新的功能而其他的都保持不变,而是我改变了一些已经存在的东西。
上述数据类型通常用于与库函数交换数据,但用户可能将其用于其他目的。如果用户使用 1.0.0 版本编写了程序并且最后的更改构成了向后兼容的更改,则用户的程序也必须使用这个新版本进行编译。
这个新版本将如何命名,1.1.0 还是 2.0.0?
编辑
您可以阅读此讨论的进一步发展 here。
这将是一个主要的版本更改。结构布局被嵌入到最终用户程序中。添加 或 删除成员是一项重大更改;无论哪种方式,布局都已更改。
引自 Linux Program Library HOWTO — §3.6。不兼容的库:
When a new version of a library is binary-incompatible with the old one the soname needs to change. In C, there are four basic reasons that a library would cease to be binary compatible:
The behavior of a function changes so that it no longer meets its original specification,
Exported data items change (exception: adding optional items to the ends of structures is okay, as long as those structures are only allocated within the library).
An exported function is removed.
The interface of an exported function changes.
你说,"The data type above is normally used for exchanging data with the library's functions, however the user might have used it with other purposes." 如果该结构仅在内部使用而不在 public API 中公开,你会没事的。但听起来用户可以自己分配一个结构变量,这意味着这是一个重大变化。
您可以使用 opaque structs 来保护您的图书馆免受此类流失的影响。隐藏结构的内容,让用户只传递指针。这正是 FILE *
的工作原理:C 标准没有定义 FILE
的布局,我们作为最终用户不知道里面有什么。
在 semantic versioning the general rule is to increase the minor number only when backwards compatible functionalities are introduced, otherwise the major number must be increased instead. The same approach 中,但算法不同,由 libtool 使用。
我有一个问题,关于什么是向后兼容的更改,什么不是。
假设我写了一个库,这个库的 public 头文件包含一个名为 foo
的数据类型的 typedef
。在版本 1.0.0 中,这个 typedef
看起来像这样:
typedef struct foo_t {
int x;
int y;
} foo;
然后我决定更改数据类型,在下一个版本中将如下所示:
typedef struct foo_t {
int x;
int y;
int z;
} foo;
我只在结构中添加了一个字段foo_t
。这似乎是一个向后兼容的更改,但是上面的结构现在 事实上 是另一个结构。我所做的并不是引入一个新的功能而其他的都保持不变,而是我改变了一些已经存在的东西。
上述数据类型通常用于与库函数交换数据,但用户可能将其用于其他目的。如果用户使用 1.0.0 版本编写了程序并且最后的更改构成了向后兼容的更改,则用户的程序也必须使用这个新版本进行编译。
这个新版本将如何命名,1.1.0 还是 2.0.0?
编辑
您可以阅读此讨论的进一步发展 here。
这将是一个主要的版本更改。结构布局被嵌入到最终用户程序中。添加 或 删除成员是一项重大更改;无论哪种方式,布局都已更改。
引自 Linux Program Library HOWTO — §3.6。不兼容的库:
When a new version of a library is binary-incompatible with the old one the soname needs to change. In C, there are four basic reasons that a library would cease to be binary compatible:
The behavior of a function changes so that it no longer meets its original specification,
Exported data items change (exception: adding optional items to the ends of structures is okay, as long as those structures are only allocated within the library).
An exported function is removed.
The interface of an exported function changes.
你说,"The data type above is normally used for exchanging data with the library's functions, however the user might have used it with other purposes." 如果该结构仅在内部使用而不在 public API 中公开,你会没事的。但听起来用户可以自己分配一个结构变量,这意味着这是一个重大变化。
您可以使用 opaque structs 来保护您的图书馆免受此类流失的影响。隐藏结构的内容,让用户只传递指针。这正是 FILE *
的工作原理:C 标准没有定义 FILE
的布局,我们作为最终用户不知道里面有什么。