Estoy intentando utilizar pkg_add
el comando de FreeBSD para instalar y actualizar paquetes binarios en una especie de escenario de compilación una vez, instalación en varias máquinas. Funciona bien al instalar un paquete nuevo, pero las actualizaciones me desconciertan. Por ejemplo, si quiero actualizar un paquete que estádepende depor otro paquete, no puedo simplemente instalarlo:
# pkg_add /path/to/somepackage-2.0.tbz
pkg_add: package 'somepackage' or its older version already installed
En este punto, puedo eliminar la versión anterior del paquete si paso -f
al pkg_delete
comando:
# 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
Pero... y esto es lo que mata... ¡ahora la información de dependencia ha desaparecido! Puedo instalar la actualización:
# pkg_add /path/to/somepackage-2.0.tbz
Y ahora los intentos de eliminarlo tendrán éxito sin ningún error:
# pkg_delete somepackage-2.0
¿Cómo manejo esto con elegancia (donde "con elegancia" significa "de una manera que preserve la información de dependencia sin necesidad de reconstruir/reinstalar toda la cadena de dependencia)?
¡Gracias!
Respuesta1
Como habrás descubierto, pkg_add
no se pueden actualizar los puertos correctamente. Sin embargo, el portupgrade
paquete hace esto bastante bien y es el método que uso y recomiendo (hay otros disponibles si no te gusta este método).
Una vez que el puerto esté instalado, simplemente puede ejecutarlo portupgrade -aPP
y actualizará todos los puertos instalados en el sistema mediante paquetes. Si no desea actualizar ningún puerto, puede ejecutar portupgrade -RPP [category/port]
para actualizar un puerto en particular y los puertos de los que depende. Ejecutar el programa sin argumentos actualizará el puerto que pertenece al directorio actual (es decir, cd /usr/ports/security/openssl ; portupgrade
actualizará openssl
, sin la -PP
opción construirá el puerto desde la fuente); y si no está en un directorio de puerto, mostrará ayuda (igual que la -h
opción).
Editar:
De forma predeterminada, portupgrade instalará los paquetes si existen en el directorio definido por la PKG_PATH
variable ambiental (el valor predeterminado es $PACKAGES/All
, $PACKAGES
el valor predeterminado es $PORTSDIR/packages
; por lo tanto, la ruta predeterminada es /usr/ports/packages/All
).
Si no existen allí, descargará los paquetes (por preferencia) de $PKG_SITES
(toma un URI con subcarpetas Latest
y All
; sin valor predeterminado), o $PACKAGEROOT
(toma un URI con la ruta espejo normal debajo; el valor predeterminado es "ftp://ftp.freebsd.org"
).
Una manera fácil de hacer esto es usar una máquina para compilar/almacenar en caché los paquetes que se instalarán en otra máquina.
- Puede crear paquetes desde el árbol de puertos
make package
en el directorio del puerto (que también instalará el puerto). - Puede usarlo
portupgrade
para actualizar una máquina y almacenar en caché los archivos del paquete para usarlos en otras máquinas; los comandos antes mencionados almacenarán en caché los archivos del paquete en el directorio predeterminado (ver arriba). - Puede utilizar portupgrade sólo para recuperar los paquetes y no instalarlos con
portupgrade -aPPF
oportupgrade -RPPF [category/port]
.
Una vez que tenga los archivos del paquete almacenados en caché, puede compartir el directorio mediante NFS, FTP, HTTP, etc. siempre que los archivos sean accesibles desde otras máquinas. Establezca PACKAGES
o PKG_SITE
con los valores apropiados para que apunte al servidor de almacenamiento en caché. Ejecute el portupgrade
comando típico, debería extraer los paquetes del servidor de caché e instalarlos.
Nota: El árbol de puertos debe estar actualizado en todos los servidores para portupgrade
que funcione correctamente (intentará actualizarse a cualquier versión que esté en el árbol de puertos local). Si va a tener los mismos puertos/paquetes instalados en todas las computadoras, podría ser más fácil compartir un /usr/ports
directorio de servidores (por ejemplo, a través de NFS) y montarlo en todos los demás servidores.
Respuesta2
Quizás pkg_replace
sea lo que estás buscando.
Lo estoy usando desde hace algún tiempo. Una de mis máquinas FreeBSD actúa como servidor de compilación y compila (usando portmaster
) todos los paquetes para las otras máquinas. Estoy usando pkg_replace
para instalar estos paquetes previos a la compilación en todas las demás máquinas.
http://www.FreeBSD.org/cgi/url.cgi?ports/ports-mgmt/pkg_replace/pkg-descr
Respuesta3
O puede confiar en Portsnap o CVSup, que se describen aquí:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html