
Я пытаюсь использовать pkg_add
команду FreeBSD для установки и обновления бинарных пакетов в сценарии build-once-install-on-multiple-machines. Это работает хорошо при установке нового пакета, но обновления сбивают меня с толку. Например, если я хочу обновить пакет, которыйзависел отдругим пакетом, я не могу просто установить его:
# pkg_add /path/to/somepackage-2.0.tbz
pkg_add: package 'somepackage' or its older version already installed
На этом этапе я могу удалить старую версию пакета, если передам -f
команду pkg_delete
:
# pkg_delete -f somepackage-1.0
pkg_delete: package 'somepackage-1.0' is required by these other packages
and may not be deinstalled (but I'll delete it anyway):
anotherpackage-1.0
Но... и это убийственно... теперь информация о зависимостях исчезла! Я могу установить обновление:
# pkg_add /path/to/somepackage-2.0.tbz
И теперь попытки удалить его будут проходить без ошибок:
# pkg_delete somepackage-2.0
Как мне решить эту проблему изящно (где «изящно» означает «таким образом, чтобы сохранить информацию о зависимостях, не требуя от меня пересборки/переустановки и всей цепочки зависимостей»).
Спасибо!
решение1
Как вы обнаружили, pkg_add
не удается обновить порты изящно. portupgrade
Однако пакет делает это довольно хорошо, и это метод, который я использую и рекомендую (есть и другие, если вам не нравится этот метод).
После установки порта вы можете просто запустить его portupgrade -aPP
, и он обновит все порты, установленные в системе, используя пакеты. Если вы не хотите обновлять ни один порт, вы можете запустить его portupgrade -RPP [category/port]
для обновления определенного порта и портов, от которых он зависит. Запуск программы без аргументов обновит порт, принадлежащий текущему каталогу (т. е. cd /usr/ports/security/openssl ; portupgrade
обновит openssl
, без -PP
параметра он построит порт из исходного кода); и если вы не находитесь в каталоге портов, он отобразит справку (такую же, как и параметр -h
).
Редактировать:
По умолчанию portupgrade установит пакеты, если они существуют в каталоге, определенном PKG_PATH
переменной среды (по умолчанию $PACKAGES/All
, $PACKAGES
по умолчанию $PORTSDIR/packages
; поэтому путь по умолчанию — /usr/ports/packages/All
).
Если их там нет, он загрузит пакеты (по выбору) из$PKG_SITES
(принимает URI с подпапками Latest
и All
; значение по умолчанию отсутствует) или $PACKAGEROOT
(принимает URI с обычным путем к зеркалу под ним; по умолчанию "ftp://ftp.freebsd.org"
).
Один из простых способов сделать это — использовать одну машину для сборки/кэширования пакетов, которые будут установлены на другой машине.
- Вы можете собирать пакеты из дерева портов
make package
в каталоге порта (что также установит порт). - Вы можете использовать его
portupgrade
для обновления одной машины и кэширования файлов пакета для использования на других машинах; вышеупомянутые команды кэшируют файлы пакета в каталоге по умолчанию (см. выше). - Вы можете использовать portupgrade только для загрузки пакетов, но не для их установки, с помощью
portupgrade -aPPF
илиportupgrade -RPPF [category/port]
.
После того, как у вас есть кэшированные файлы пакетов, вы можете предоставить общий доступ к каталогу через NFS, FTP, HTTP и т. д.; при условии, что файлы доступны с других машин. Установите PACKAGES
илиPKG_SITE
с соответствующими значениями, чтобы указать на сервер кэширования. Выполните типичную portupgrade
команду, она должна извлечь пакеты с сервера кэширования и установить их.
Примечание: Дерево портов должно быть обновлено на всех серверах для portupgrade
корректной работы (оно попытается обновиться до любой версии в локальном дереве портов). Если вы собираетесь установить одни и те же порты/пакеты на всех компьютерах, может быть проще всего сделать общим один /usr/ports
каталог сервера (например, через NFS) и смонтировать его на всех других серверах.
решение2
Может бытьpkg_replace
это то, что вы ищете.
Я использую его уже некоторое время. Одна из моих машин FreeBSD работает как сервер сборки и собирает (используя portmaster
) все пакеты для других машин. Я использую его pkg_replace
для установки этих пакетов предварительной сборки на все другие машины.
http://www.FreeBSD.org/cgi/url.cgi?ports/ports-mgmt/pkg_replace/pkg-descr
решение3
Или вы можете положиться на Portsnap или CVSup, описанные здесь:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html