Я пытаюсь использовать FreeBSD pkg_add
команда для установки и обновления двоичных пакетов в сценарии типа "сборка один раз установка на нескольких машинах". Он хорошо работает при установке нового пакета, но обновления сбивают меня с толку. Например, если я хочу обновить пакет, зависел от другим пакетом не могу просто установить:
# 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
Как мне с этим справиться изящно (при этом «изящно» означает «таким образом, который сохраняет информацию о зависимостях, не требуя от меня перекомпоновки / переустановки всей цепочки зависимостей»).
Спасибо!
Как вы обнаружили, pkg_add
не может корректно обновить порты. В portupgrade
package делает это довольно хорошо, и это метод, который я использую и рекомендую (есть другие доступные, если вам не нравится этот метод).
После установки порта вы можете просто запустить 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 -aPPF
или portupgrade -RPPF [category/port]
.После того, как у вас есть кэшированные файлы пакетов, вы можете поделиться каталогом через NFS, FTP, HTTP и т. Д .; пока файлы доступны с других машин. Установить PACKAGES
или PKG_SITE
с соответствующими значениями, указывающими на кэширующий сервер. Выполнить типичный portupgrade
, она должна извлечь пакеты с кэширующего сервера и установить их.
Примечание: дерево портов должно быть актуальным на всех серверах для portupgrade
для правильной работы (он попытается выполнить обновление до той версии, которая есть в локальном дереве портов). Если на всех компьютерах будут установлены одни и те же порты / пакеты, проще всего будет использовать один сервер. /usr/ports
каталог (скажем, через NFS) и смонтируйте его на всех остальных серверах.
Может быть pkg_replace
это то, что вы ищете.
Я использую это, чтобы бросить курить некоторое время. Одна из моих машин FreeBSD действует как сервер сборки и выполняет сборку (используя portmaster
) все пакеты для других машин. Я использую pkg_replace
для установки этих предварительно собранных пакетов на все остальные машины.
http://www.FreeBSD.org/cgi/url.cgi?ports/ports-mgmt/pkg_replace/pkg-descr
Или вы можете положиться на Portsnap или CVSup, описанные здесь:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html