FreeBSD 上的 pkg_add 环境

FreeBSD 上的 pkg_add 环境

假设您想添加一个包 foo,但是当您通过以下方式调用 pkg_add 时:

pkg_add -r foo

你收到一个错误:

Error: Unable to get ftp://.../foo.tbz: File unavailable ...

这不是问题,因为根据 pkg_add 的手册页,您所要做的就是将 PACKAGEROOT 环境变量设置为 foo 的根目录:

PACKAGEROOT=ftp://root/to/package

别那么快!它问题来了——它不起作用!如果你不导出 PACKAGEROOT,那么 pkg_add 会使用其默认位置,导出 PACKAGEROOT 会给你带来错误:

pkg_add: can't stat package file 'foo'

设置 PACKAGESITE 变量时也是如此。

现在,我实际上已经解决了这个问题:

pkg_add -r ftp://my/package/root/foo.tbz

运行良好。不过,我有两个问题:

  1. 到底啥can't stat package file 'foo'意思?
  2. 为什么它不像广告中说的那样有效?

感兴趣的朋友,我在尝试安装 Enlightenment 时遇到了这个问题。ports 版本很旧,而且我本来就不想编译,因为编译需要一段时间。我通过不同的终端会话独立设置了 PACKAGEROOT 和 PACKAGESITE:

export PACKAGEROOT=ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.0-release/x11-wm

export PACKAGESITE=ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.0-release/x11-wm/

但都没有用。

答案1

PACKAGEROOT 和 PACKAGESITE 之间的区别在于 PACKAGEROOT 保留了原始目录逻辑,而 PACKAGESITE 不保留。以下是正确的:

PACKAGEROOT=ftp://ftp.freebsd.org

PACKAGESITE=ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.0-release/Latest/

回答你的问题:

  1. 这意味着 pkg_add 找不到该文件。您只能在 PACKAGESITE 中看到它,因为设置该变量会覆盖搜索过程,这通常会产生“找不到软件包 foo”的结果。

  2. 是的。当您指定了 PACKAGESITE 时,“pkg_add -r foo”所做的就是尝试打开 $PACKAGESITE/foo.tbz。您看到问题了吗?转到您的 PACKAGESITE 值并查找 enlightenment.tbz。

    您没有找到。您找到的最接近的版本是 enlightenment-0.16.999.042_3,2.tbz。因此 pkg_add -r "enlightenment-0.16.999.042_3,2" 可以工作。将您的 PACKAGESITE 更改为ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.0-release/Latest/并且它会起作用。

    这就是 Latest/ 子目录存在的全部原因。

答案2

只是出于好奇,你真的读过吗http://www.freebsd.org/doc/en/books/handbook/packages-using.html或者只是浏览一下?它的工作方式与描述的完全一致。

尝试

export PACKAGESITE=ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8-stable/Latest/

此外,“无法统计包‘foo’”基本上意味着它找不到该文件(它试图对文件进行统计但失败了。有关更多详细信息,请参阅 man 2 stat)

答案3

在 8.2 版本中,我发现问题在于我没有使用 BASH 作为我的根 shell。我将“export PACKAGEROOT”行添加到我的 ~/.profile 中,但直到我使用 bash 作为 shell 时,它才真正生效。也许你的根 shell 是 /bin/csh,这就是为什么他们分配变量,然后将其作为 ~/.profile 中的单独语句导出。我还没有测试过,无法确定

相关内容