Среда pkg_add во FreeBSD
Предположим, вы хотите добавить пакет foo, но когда вы вызываете pkg_add через:
pkg_add -r foo
вы получаете ошибку:
Error: Unable to get ftp://.../foo.tbz: File unavailable ...
Это не проблема, поскольку, согласно man-странице 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. Версия портов старая, и я все равно не хотел компилировать, так как это занимает некоторое время. Я устанавливаю 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/
но ни один не работал.
3 ответа
Разница между 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 и поищите файл ightenlight.tbz.
Вы не нашли это. Самое близкое, что вы нашли, было просветление -0.16.999.042_3,2.tbz. Таким образом, pkg_add -r "просветление-0.16.999.042_3,2" будет работать. Измените свой PACKAGESITE на ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.0-release/Latest/ и он будет работать.
Это единственная причина, по которой существует последний / подкаталог.
Просто из любопытства, вы действительно читали 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'" в основном означает, что он не может найти этот файл (он попытался выполнить stat() для файла и потерпел неудачу. Подробнее см. Man 2 stat)
В версии 8.2 я обнаружил, что проблема заключается в том, что я не использовал BASH в качестве корневой оболочки. Я добавил строку 'export PACKAGEROOT' в свой ~/.profile, но на самом деле она не вступила в силу, пока я не использовал bash в качестве оболочки. Возможно, с вашей корневой оболочкой как /bin/csh, поэтому они присваивают переменную, а затем экспортируют ее как отдельный оператор в ваш ~/.profile. Я не проверял это, чтобы знать наверняка