![FreeBSD 上的 pkg_add 环境](https://linux22.com/image/500345/FreeBSD%20%E4%B8%8A%E7%9A%84%20pkg_add%20%E7%8E%AF%E5%A2%83.png)
假设您想添加一个包 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
运行良好。不过,我有两个问题:
- 到底啥
can't stat package file 'foo'
意思? - 为什么它不像广告中说的那样有效?
感兴趣的朋友,我在尝试安装 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/
回答你的问题:
这意味着 pkg_add 找不到该文件。您只能在 PACKAGESITE 中看到它,因为设置该变量会覆盖搜索过程,这通常会产生“找不到软件包 foo”的结果。
是的。当您指定了 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 中的单独语句导出。我还没有测试过,无法确定