我正在为生物信息学工具包创建一个包,该工具包构建了几十个二进制文件和脚本。就目前情况而言,这些都以包管理器使用的任何前缀安装到“bin”目录中。我让维护包存储库的人运行了这个程序,这让他们皱起了眉头,因为它创造了许多与其他包发生文件名冲突的机会。
大多数用户只会使用大约 9 个可执行文件。其余的是实用程序,例如文件格式转换器。包存储库管理器建议将其他可执行文件安装在 libexec 下的子目录中。这很容易做到,但我有点担心它不符合 libexec 在文件系统层次结构标准,因为可执行文件是旨在由最终用户直接运行。
对于一个包来说,是否有更好的目的地来安装几十个不常用的可执行文件?
答案1
libexec
很好,例如 RedHat 上的 postfix MTA 在/usr/libexec/postfix
. mailman
RedHat 上打包的另一个选项/usr/lib/mailman/bin
用于其命令行实用程序(newlist
、list_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-6
和gcc-7
)。