我可以在 debian 软件包中添加类似 anti-dependency 的东西吗?
Can I add something like an anti-dependency to a debian package?
我有两个包含相同库但 API 截然不同的包。每个库版本都应有自己的包,例如lib1.deb 和 lib2.deb。
我不想重命名所有库和 headers 以使它们可以共存,但是某些 libs/headers 将具有相同的路径/相互覆盖。在 "control" 文件中,当 f.i。使用 debuild 生成一个包,我可以以某种方式指定一个不能在安装其他包的同时安装的包吗?
如果在尝试安装 package2 时,apt 会自动删除 package1,那就太好了。我想我在安装软件包时已经看到了类似的东西。
嗯,在 stackexchange 上发现了一个 post 涵盖 https://unix.stackexchange.com/a/393243
貌似有"Breaks"和"Conflicts"个关键字https://www.debian.org/doc/debian-policy/#conflicting-binary-packages-conflicts
您仍然应该考虑制作这些软件包 co-installable(想象一下,您需要安装一个图形程序并且 apt
想要删除整个网络堆栈,只是因为一些 "clever"包维护者决定放入 Conflicts
比解决问题容易得多。
通常没那么难:
将所有 header 文件放入 library-specific 子目录,例如/usr/include/lib1/
分别。 /usr/include/lib2/
(任何 well-written 库都应提供一个 pkg-config 文件,无论如何都需要更新)。
正常情况下,库文件很少,主要是3个(libfoo.so.x.y
、libfoo.so.x
、libfoo.x
)。单独重命名它们应该很容易。 (再次更新您的 pkg-config 文件以反映 name-change)。
最后:“同一个库的两个包,但具有非常不同的 API”听起来像是一个非常糟糕的想法。如果他们没有 same API/ABI?
为什么他们是 same 库
哦,如果这只是关于(不兼容)版本,这通常被处理为:
libfoo3
是 libfoo
与 ABI-version 3 的包,例如它提供 /usr/lib/libfoo.so.3.14
和 /usr/lib/libfoo.so.3
,这是前者的符号链接
libfoo7
是 libfoo
与 ABI-version 7 的包,例如它提供 /usr/lib/libfoo.so.7.42
和 /usr/lib/libfoo.so.7
,这是前者的符号链接)
libfoo-dev
是开发包,它提供 headers 和符号链接 /usr/lib/libfoo.so
到 correct ABI soname (/usr/lib/libfoo.so.3
对应 /usr/lib/libfoo.so.7
)。此软件包在正确的 libfooX
上有 Depends
,使用确切的版本说明符。
您只能安装一个 libfoo-dev
版本(因为 apt
禁止多次安装单个软件包)。
但是,您可以同时安装 libfoo3
和 libfoo7
(这对于使用它的应用程序很重要)。
我有两个包含相同库但 API 截然不同的包。每个库版本都应有自己的包,例如lib1.deb 和 lib2.deb。 我不想重命名所有库和 headers 以使它们可以共存,但是某些 libs/headers 将具有相同的路径/相互覆盖。在 "control" 文件中,当 f.i。使用 debuild 生成一个包,我可以以某种方式指定一个不能在安装其他包的同时安装的包吗? 如果在尝试安装 package2 时,apt 会自动删除 package1,那就太好了。我想我在安装软件包时已经看到了类似的东西。
嗯,在 stackexchange 上发现了一个 post 涵盖 https://unix.stackexchange.com/a/393243
貌似有"Breaks"和"Conflicts"个关键字https://www.debian.org/doc/debian-policy/#conflicting-binary-packages-conflicts
您仍然应该考虑制作这些软件包 co-installable(想象一下,您需要安装一个图形程序并且 apt
想要删除整个网络堆栈,只是因为一些 "clever"包维护者决定放入 Conflicts
比解决问题容易得多。
通常没那么难:
将所有 header 文件放入 library-specific 子目录,例如
/usr/include/lib1/
分别。/usr/include/lib2/
(任何 well-written 库都应提供一个 pkg-config 文件,无论如何都需要更新)。正常情况下,库文件很少,主要是3个(
libfoo.so.x.y
、libfoo.so.x
、libfoo.x
)。单独重命名它们应该很容易。 (再次更新您的 pkg-config 文件以反映 name-change)。
最后:“同一个库的两个包,但具有非常不同的 API”听起来像是一个非常糟糕的想法。如果他们没有 same API/ABI?
为什么他们是 same 库哦,如果这只是关于(不兼容)版本,这通常被处理为:
libfoo3
是libfoo
与 ABI-version 3 的包,例如它提供/usr/lib/libfoo.so.3.14
和/usr/lib/libfoo.so.3
,这是前者的符号链接libfoo7
是libfoo
与 ABI-version 7 的包,例如它提供/usr/lib/libfoo.so.7.42
和/usr/lib/libfoo.so.7
,这是前者的符号链接)libfoo-dev
是开发包,它提供 headers 和符号链接/usr/lib/libfoo.so
到 correct ABI soname (/usr/lib/libfoo.so.3
对应/usr/lib/libfoo.so.7
)。此软件包在正确的libfooX
上有Depends
,使用确切的版本说明符。
您只能安装一个 libfoo-dev
版本(因为 apt
禁止多次安装单个软件包)。
但是,您可以同时安装 libfoo3
和 libfoo7
(这对于使用它的应用程序很重要)。