我有一个用于共享库的 Debian 软件包。假设该库名为 threadx。我安装的是0.0.1版本。所以这个包包含:
/lib/i386-linux-gnu/libthreadx.so.0.0.1
/lib/i386-linux-gnu/libthreadx.so.0 # symlink to libthreadx.so.0.0.1
如果我现在想升级到 0.0.2,该软件包将包含:
/lib/i386-linux-gnu/libthreadx.so.0.0.2
/lib/i386-linux-gnu/libthreadx.so.0 # symlink to libthreadx.so.0.0.2
哪个冲突,因为/lib/i386-linux-gnu/libthreadx.so.0
是同一个文件。错误信息是
dpkg: error processing archive /tmp/apt-dpkg-install-SwpeYD/01-libthreadx0.0.2_0.0.2_i386.deb (--unpack):
trying to overwrite '/lib/i386-linux-gnu/libthreadx.so.0', which is also in package libthreadx0.0.1:i386 0.0.1
我希望能够并行安装两个包(libthreadx0.0.1
和libthreadx0.0.2
),并使符号链接指向最新的库。
我无法找到如何配置/打包这个有效的实际建议。有这个线程谈论它,但没有透露任何细节:
实际上,如果操作正确,您可以安装共享库的多个版本。
而且 debian 手册对我来说也很晦涩,所以要么没有关于如何执行此操作的信息,要么我不理解它。https://www.debian.org/doc/debian-policy/ch-sharedlibs.html
答案1
问题来自于包名称中存在完整版本:libthreadx0.0.2
和libthreadx0.0.1
。当您安装前者时,dpkg
并不认为它是后者的升级,而是与它一起安装的新软件包。因此,dpkg
不会自动为您处理“替换”文件,您必须提供其他信息来帮助它执行此操作。
libthreadx.so.0
理论上,在本例中,库包名称应该反映库的 soname ;所以库包应该是libthreadx0
,下划线后带有适当的版本号:libthreadx0_0.0.1-1_i386.deb
, libthreadx0_0.0.2-1_i386.deb
。但正如您所注意到的,这不允许并行安装。
由于您希望允许并行安装,因此必须允许包含该库的更高版本的包来替换早期包中的符号链接:您可以通过添加来做到这一点一Replaces
节在包的控制文件中,例如在本例中,在libthreadx0.0.2
的控制文件中,
Replaces: libthreadx0.0.1
这并不意味着libthreadx0.0.2
完全取代libthreadx0.0.1
,但它允许它提供冲突的文件。libthreadx0.0.2
安装后,其符号链接将替换libthreadx0.0.1
's。
从技术上讲,由于这改变了符号链接,它“破坏”了(术语dpkg
)libthreadx0.0.1
包 - 或者更确切地说,它破坏了依赖于 的包libthreadx0.0.1
,因为它们将不再通过以前由 提供的符号链接找到正确的库libthreadx0.0.1
。这通常也会使用Breaks
节来声明,但这在这里不合适,因为您想保留libthreadx0.0.1
.
如果用户安装libthreadx0.0.1
、安装libthreadx0.0.2
、然后删除libthreadx0.0.2
并期望libthreadx0.0.1
再次使用,这也会导致设置损坏:符号链接将不会恢复。
事实上,您的 soname 在两个库中都是相同的,这表明它们并不是真正的可用的首先是并行的,但这是另一个讨论的问题。