我可以在 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.ylibfoo.so.xlibfoo.x)。单独重命名它们应该很容易。 (再次更新您的 pkg-config 文件以反映 name-change)。

最后:“同一个库的两个包,但具有非常不同的 API”听起来像是一个非常糟糕的想法。如果他们没有 same API/ABI?

为什么他们是 same

哦,如果这只是关于(不兼容)版本,这通常被处理为:

  • libfoo3libfoo 与 ABI-version 3 的包,例如它提供 /usr/lib/libfoo.so.3.14/usr/lib/libfoo.so.3 ,这是前者的符号链接
  • libfoo7libfoo 与 ABI-version 7 的包,例如它提供 /usr/lib/libfoo.so.7.42/usr/lib/libfoo.so.7 ,这是前者的符号链接)
    • libfoo-dev 是开发包,它提供 headers 和符号链接 /usr/lib/libfoo.socorrect ABI soname (/usr/lib/libfoo.so.3 对应 /usr/lib/libfoo.so.7)。此软件包在正确的 libfooX 上有 Depends,使用确切的版本说明符。

您只能安装一个 libfoo-dev 版本(因为 apt 禁止多次安装单个软件包)。 但是,您可以同时安装 libfoo3libfoo7(这对于使用它的应用程序很重要)。