我们的开发环境是FreeBSD 10.3。我听说 FreeBSD 以这种方式管理包依赖关系,它总是寻找主包所依赖的所有包的最新版本。这看起来像是真的。所以,我的问题是:
- 这是真的?有什么官方文件可以证明吗?
- 克服这个问题的最佳方法是什么?
答案1
FreeBSD 如何构建软件包
FreeBSD 项目过去只为发行版本构建软件包,偶尔也为 STABLE 分支构建软件包。旧的软件包构建器使用名为 Portbuild 的分布式系统。它将使用一大群较小的 2GB-4GB 机器来构建包。这很容易出错并且速度很慢,主要是由于机器较旧。完整的构建可能仍需要一周的时间。如今,包装是使用 Poudriere 使用单个大型机器来构建的。 (从布莱恩·德鲁里 (Brian Drewery) 的网页)。
也可以看看:如何在 FreeBSD 上更新软件包和端口的组合
FreeBSD 与 Solaris 和 Windows 一样具有不断发展的 ABI(和 API),而 Linux 具有稳定(停滞?)的 ABI(和 API),因此对于 Linux,旧的二进制文件仍将在较新的操作系统版本上运行,而对于非 Linux 操作系统则不是这样。情况并非总是如此(有时确实如此)。
使用pkg lock
还可以导致头痛,虽然它会锁(提供警告)当您尝试使用pkg upgrade
它进行升级时,仍然假定更高编号的版本是更好的(理想的)并且这是您想要做的事情 - 所以它请求许可,您可以允许,但它不能保证其他东西不会被破坏。请参阅上面的 URL,或此讨论:“您是否希望 FreeBSD 锁定通过 pkg 分发的操作系统版本的二进制包版本?”。
如果一个包被锁定有时您必须授予解锁并进行升级的权限,而这将工作对于一个包(及其所有依赖项),不能保证其他东西不会与新库不兼容(因此也需要升级,如果目前有一个可用)。
布莱恩·德鲁里的博客:“FreeBSD 期刊:Poudriere” 认为:
“停止在服务器上使用 portmaster、portupgrade 和 ports,并切换到软件包。
使用 Poudriere 设置您自己的软件包构建只需几分钟,并将在将来为您节省大量时间。
...
如果您正在维护多个 FreeBSD 系统并且尚未使用软件包,那么您应该这么做。我只维护 20 台服务器,但在每个系统上构建端口花费了我大量的时间,并且浪费了生产机器上的资源。在多个服务器上构建端口时,很容易使它们的选项或版本不同步。通过在一个系统上构建一次软件包,我减轻了系统的负载,减少了我必须做的工作量,并使我的所有系统保持一致。我不需要在每个系统上处理相同的故障,而只需在构建系统上处理它。
但是,结...
为什么您需要偏离官方软件包? ports 框架为 ports 提供选项支持以更改构建时配置。并非所有应用程序都支持运行时配置。某些应用程序必须根据启用的功能进行不同的编译。其他人可以选择简单地减少默认端口中的功能和依赖项的数量。对于服务器管理员来说,这可能很快就会导致发现某些默认包不满足他们的要求。
所以 ...
有几种方法可以获得自定义包。 Pkg 支持使用多个存储库。可以将其设置为使用官方 FreeBSD 存储库作为主要存储库,并使用自定义存储库作为辅助存储库。 Pkg 不受它可以跟踪的存储库数量的限制,并且可以按优先级重新排序。多个存储库的问题是目前很难维护。当 Pkg 检测到已安装的软件包与它正在跟踪的存储库具有不同的选项或依赖项时,将从可能的任何远程版本重新安装该软件包。您可以在升级期间使用 pkg lock PKGNAME 和 pkg unlock PKGNAME 锁定软件包,或者使用 pkg annotate -A PKGNAME 存储库 REPONAME 将其绑定到特定存储库。还有一个微妙的问题是如何使自定义存储库的 ports 树与 FreeBSD 软件包保持同步。由于包是根据每周一次的 ports 树快照构建的,如果您的自定义存储库不匹配,则可能会导致冲突。只需构建一个包含您需要的内容和您想要的选项的完整软件包集要简单得多。
解决方案:
Poudriere(大致发音为 poo-dree-year,法语中的“火药桶”)是为了更快、更简单地替代 Tinderbox 而编写的。它是由 Pkg 作者 Baptiste Daroussin 编写的,现在主要由我和 Baptiste 以及其他一些贡献者一起维护。它已迅速成为事实上的 FreeBSD 端口测试和包构建工具。它是官方构建集群工具,也是FreeBSD Ports 项目用于测试在所谓的“exp-runs”中清理补丁。它是用 POSIX shell 编写的,并且正在慢慢转移到 C 组件。与 Tinderbox 不同的是,它有没有依赖关系,不需要数据库。它经过了极大的优化,所有操作都高度并行。它使用监狱在非常严格的条件下在沙盒环境中构建端口。只需一个简单的命令即可创建一次监狱。在构建过程中,会自动为每个使用的 CPU 克隆监狱,为端口提供一个干净的构建空间。”
设置您自己的存储库普德里埃让您拥有端口的灵活性和包的轻松管理。