Estou tentando usar pkg_add
o comando do FreeBSD para instalar e atualizar pacotes binários em um cenário do tipo build-once-install-on-multiple-machines. Funciona bem ao instalar um novo pacote, mas as atualizações estão me deixando perplexo. Por exemplo, se eu quiser atualizar um pacote que estádependia depor outro pacote, não posso simplesmente instalá-lo:
# pkg_add /path/to/somepackage-2.0.tbz
pkg_add: package 'somepackage' or its older version already installed
Neste ponto, posso excluir a versão mais antiga do pacote se passar -f
para o 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
Mas... e este é o assassino... agora a informação de dependência desapareceu! Posso instalar a atualização:
# pkg_add /path/to/somepackage-2.0.tbz
E agora as tentativas de excluí-lo serão bem-sucedidas sem erros:
# pkg_delete somepackage-2.0
Como faço para lidar com isso normalmente (em que "graciosamente" significa "de uma forma que preserva as informações de dependência sem exigir que eu reconstrua/reinstale toda a cadeia de dependências").
Obrigado!
Responder1
Como você descobriu, pkg_add
não é possível atualizar as portas normalmente. O portupgrade
pacote faz isso muito bem e é o método que uso e recomendo (existem outros disponíveis se você não gostar desse método).
Depois que a porta estiver instalada, você pode simplesmente executá-la portupgrade -aPP
e ela atualizará todas as portas instaladas no sistema usando pacotes. Se não quiser atualizar nenhuma porta, você pode executar portupgrade -RPP [category/port]
para atualizar uma porta específica e as portas das quais ela depende. Executar o programa sem argumentos atualizará a porta pertencente ao diretório atual (ou seja, cd /usr/ports/security/openssl ; portupgrade
atualizará openssl
, sem a -PP
opção de construir a porta a partir da fonte); e se você não estiver em um diretório de porta, ele exibirá ajuda (igual à -h
opção).
Editar:
Por padrão, o portupgrade instalará pacotes se eles existirem no diretório definido pela PKG_PATH
variável ambiental (o padrão é $PACKAGES/All
, $PACKAGES
o padrão é $PORTSDIR/packages
; então o caminho padrão é /usr/ports/packages/All
).
Se eles não existirem lá, ele fará o download dos pacotes (por preferência) de $PKG_SITES
(pega um URI com subpastas Latest
e All
; sem valor padrão) ou $PACKAGEROOT
(pega um URI com o caminho de espelho normal; o padrão é "ftp://ftp.freebsd.org"
).
Uma maneira fácil de fazer isso é usar uma máquina para compilar/armazenar em cache pacotes que serão instalados em outra máquina.
- Você pode construir pacotes a partir da árvore de ports
make package
no diretório do port (que também instalará o port). - Você pode usar
portupgrade
para atualizar uma máquina e armazenar em cache os arquivos do pacote para uso em outras máquinas. Os comandos mencionados acima irão armazenar em cache os arquivos do pacote no diretório padrão (veja acima). - Você pode usar o portupgrade para buscar apenas os pacotes, e não instalá-los, com
portupgrade -aPPF
ouportupgrade -RPPF [category/port]
.
Depois de armazenar os arquivos do pacote em cache, você poderá compartilhar o diretório via NFS, FTP, HTTP, etc; desde que os arquivos estejam acessíveis em outras máquinas. Configure PACKAGES
ou PKG_SITE
com os valores apropriados para apontar para o servidor de cache. Execute o portupgrade
comando típico, ele deve extrair os pacotes do servidor de cache e instalá-los.
Nota: A árvore de portas deve estar atualizada em todos os servidores para portupgrade
funcionar corretamente (ele tentará atualizar para qualquer versão que esteja na árvore de portas locais). Se você tiver as mesmas portas/pacotes instaladas em todos os computadores, pode ser mais fácil compartilhar um /usr/ports
diretório de servidores (digamos, por NFS) e montá-lo em todos os outros servidores.
Responder2
Talvez pkg_replace
seja o que você está procurando.
Estou usando para sair há algum tempo. Uma das minhas máquinas FreeBSD atua como servidor de compilação e constrói (usando portmaster
) todos os pacotes para as outras máquinas. Estou usando pkg_replace
para instalar esses pacotes pré-construídos em todas as outras máquinas.
http://www.FreeBSD.org/cgi/url.cgi?ports/ports-mgmt/pkg_replace/pkg-descr
Responder3
Ou você pode contar com Portsnap ou CVSup, descritos aqui:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html