创建包含 60 多个二进制文件和脚本的包。可执行文件应该安装在哪里?

创建包含 60 多个二进制文件和脚本的包。可执行文件应该安装在哪里?

我正在为生物信息学工具包创建一个包,该工具包构建了几十个二进制文件和脚本。就目前情况而言,这些都以包管理器使用的任何前缀安装到“bin”目录中。我让维护包存储库的人运行了这个程序,这让他们皱起了眉头,因为它创造了许多与其他包发生文件名冲突的机会。

大多数用户只会使用大约 9 个可执行文件。其余的是实用程序,例如文件格式转换器。包存储库管理器建议将其他可执行文件安装在 libexec 下的子目录中。这很容易做到,但我有点担心它不符合 libexec 在文件系统层次结构标准,因为可执行文件旨在由最终用户直接运行。

对于一个包来说,是否有更好的目的地来安装几十个不常用的可执行文件?

答案1

libexec很好,例如 RedHat 上的 postfix MTA 在/usr/libexec/postfix. mailmanRedHat 上打包的另一个选项/usr/lib/mailman/bin用于其命令行实用程序(newlistlist_lists等)。

但是,如果实用程序需要包含在其中,PATH那么您还需要确保调整 shell 配置以包含该配置(或者只是将所有内容转储到目录中bin并使用它,或者对于不在其中的实用程序PATH来完全限定PATH在确实需要打电话给他们的事情上给他们......)

答案2

libexec-using 系统上,/usr/libexec/yourpackage很好,因为解释了经过特里格/usr/lib/yourpackage任何地方都可以工作。

这并不能解决访问问题。将新目录添加到路径可能不合适,因为这会重新引入冲突问题。一个潜在的解决方案是在 中使用启动器脚本/usr/bin,其风格与其git所有子命令相同;我们称之为bit(生物信息学工具包):

#!/bin/sh

prefix=/usr/lib/yourpackage/bin

if [ ! -x "${prefix}/$1" ]; then
    echo Unknown bit subcommand "$1"
    exit 1
fi

shift
exec "${prefix}/$1" "$@"

一旦您的用户重新训练了他们的手指,您的软件包的工具将可以合理地访问......

答案3

请注意/usr/libexec/(或其中的某些子目录,或其他地方,例如在 下/usr/lib)并不意味着(也不应该)在用户的目录中$PATH,可能短至/bin:/usr/bin。那里的可执行文件永远不应该由用户直接启动,只能由某些特定的其他(用户启动的)程序(不是 shell)启动。例如,g++正在启动/usr/lib/gcc/x86_64-linux-gnu/7/cc1plus(并且用户不应该cc1plus直接运行该程序)。

可以有一个包安装多个可执行文件/usr/bin/(位于$PATH),并且该目录预计会相当大。我在那里有超过 4400 个文件,单个coreutils包安装了超过 100 个可执行文件。

您可以决定您的软件包的用户始终使用单个驱动程序,有点像git

您可以为包的可执行文件共享一个公共前缀。例如,所有 XFCE 相关的二进制文件都以 开头xfce,所有 LXDE 二进制文件都以 开头lx。实际上,我建议遵循类似的约定。

或者,如果甚至不安装某些可执行文件是有意义的,您也可以将包拆分为多个包。

您甚至可以设计您的包装以允许套件的多个版本共存(例如,我有gcc-6gcc-7)。

相关内容