使用 SONAME 的库的版本控制最佳实践

Version control best practices for libraries with SONAME

我正在为 Linux 创建包和库,其中在文件名 soname 中包含包或库版本。 使用版本控制处理此问题的当前最佳实践是什么?通常,版本控制将维护映射到用户工作区的版本化文件的存储库。
我们都知道歌舞:

//repo/myfile.txt#1     //ws/myfile.txt

但是当我使用版本库时,这会变得很麻烦。

//repo/libs/my-library.so.1.0#1    //ws/libs/my-library.so.1.0
//repo/libs/my-library.so.1.1#1    //ws/libs/my-library.so.1.1
. . . 
//repo/libs/my-library.so.3.0#1    //ws/libs/my-library.so.3.0

当我在我的存储库上执行 get latest 时,我不一定需要包的每个版本,只是最新的。此外,版本控制系统的全部意义在于消除开发人员的这种麻烦。但是,用户在分发这些库时实际上需要版本文件名。

有没有办法告诉我的版本控制系统像这样执行映射?

//repo/libs/my-library.so#1     //ws/libs/my-library.so.1.0
//repo/libs/my-library.so#2     //ws/libs/my-library.so.1.1
. . . 
//repo/libs/my-library.so#30    //ws/libs/my-library.so.3.0

在我特定的主观用例中,我使用 Perforce 进行版本控制。然而,我主要对一般的最佳实践感到好奇,而不仅仅是 Perforce 的 hack 来实现这一点,如果它完全是一种愚蠢的方法。

由于 soname 描述的是库接口的版本,而不是其实现,因此它大致对应于软件生命周期管理方面的“发布”。在大多数版本控制系统(包括 Perforce)中,这意味着您希望将其表示为某种形式的分支(每个分支可能具有对应于实现更改的任意数量的修订),而不是将每个单独的 revision/commit 映射到其自己的soname.

Perforce 的文件间分支系统使建模变得非常容易——当需要修改 soname 时,您将文件分支到它的新名称,就像您自然会使用 cp 一样,如果您没有使用版本控制。 (与 git 不同,您不必将整个存储库作为一个单元进行分支;如果需要,每个单独的文件都可以有自己的分支结构,并且变体在客户端文件系统和回购。)

如果您当前的项目需要一个特定的 soname 变体,并且您不想在同步时拉下所有其他变体,请将您的客户端视图设置为仅映射您想要的那个。