Determinar sinalizadores que foram fornecidos para pacotes instalados com homebrew


17

Existe uma maneira de verificar quais sinalizadores foram dados quando um pacote foi instalado com homebrew?

Por exemplo, a fórmula emacs tem um número absurdo de sinalizadores. Se eu fiz

brew install emacs --with-glib --with-librsvg

Mais tarde, gostaria de determinar que, para a instalação homebrew do emacs, dei as bandeiras --with-glib --with-librsvge não outras.

Caso de teste com pacote lua:

Antes de instalar o pacote, as informações mostram todas as opções.

$ brew info lua
lua: stable 5.2.3 (bottled)
http://www.lua.org/
Not installed
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/lua.rb
==> Options
--universal
    Build a universal binary
--with-completion
    Enables advanced readline support
--without-sigaction
    Revert to ANSI signal instead of improved POSIX sigaction

Eu instalo o pacote apenas com a --with-completionbandeira.

$ brew install lua --with-completion
==> Downloading http://www.lua.org/ftp/lua-5.2.3.tar.gz
######################################################################## 100.0%
==> Downloading http://luajit.org/patches/lua-5.2.0-advanced_readline.patch
######################################################################## 100.0%
==> Downloading http://lua-users.org/files/wiki_insecure/power_patches/5.2/lua-5
######################################################################## 100.0%
==> Patching
patching file Makefile
patching file src/Makefile
patching file src/lua.c
Hunk #1 succeeded at 231 (offset -5 lines).
Hunk #2 succeeded at 559 (offset -4 lines).
Hunk #3 succeeded at 575 (offset -4 lines).
patching file src/lua.c
==> make macosx INSTALL_TOP=/usr/local/Cellar/lua/5.2.3_1 INSTALL_MAN=/usr/local
==> make install INSTALL_TOP=/usr/local/Cellar/lua/5.2.3_1 INSTALL_MAN=/usr/loca
🍺  /usr/local/Cellar/lua/5.2.3_1: 13 files, 312K, built in 6 seconds

Depois de instalar o pacote, as informações mostram todas as opções, incluindo as que não usei. O comando reconhece que o pacote foi criado a partir da fonte e não foi derramado de uma garrafa.

$ brew info lua
lua: stable 5.2.3 (bottled)
http://www.lua.org/
/usr/local/Cellar/lua/5.2.3_1 (13 files, 312K) *
  Built from source with: --with-completion
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/lua.rb
==> Options
--universal
    Build a universal binary
--with-completion
    Enables advanced readline support
--without-sigaction
    Revert to ANSI signal instead of improved POSIX sigaction

Respostas:


15

Quando um pacote é criado a partir da fonte, os sinalizadores que foram usados ​​para criar são mostrados quando você faz brew info <package>.

Nesse caso: brew info emacs | grep "Built from source"


A saída das informações de distribuição sempre lista todas as opções disponíveis para a fórmula, não as opções usadas se o pacote foi instalado.
Praxeolitic

1
Isso não é verdade. As informações especificam se o pacote foi instalado a partir de uma garrafa ou construído a partir da fonte e, se foi construído a partir da fonte, mostra os sinalizadores que foram usados.
André

OP editado com um exemplo no qual, até onde eu sei, as informações não especificam os sinalizadores usados ​​para um pacote criado a partir da fonte.
Praxeolitic

2
Oh oops, eu vejo isso e seu comando grep faz sentido agora.
Praxeolitic

6

Há um arquivo /usr/local/Cellarabaixo de cada pacote chamado INSTALL_RECEIPT.json, por exemplo, para gawk:

/usr/local/Cellar/gawk/4.1.3/INSTALL_RECEIPT.json

que define como o pacote foi instalado. Eu acho que a maneira correta de acessá-lo é com

brew info --json=v1 <packagename>

por exemplo

brew info --json=v1 gnuplot

Isso gera muitas coisas, mas se você enviar jq(JSON Processor - disponível com facilidade homebrew), poderá selecionar as opções usadas para instalar o pacote assim (verificando o gnuplotpacote):

brew info --json=v1 gnuplot | jq '.[].installed[0].used_options'
[
    "--with-qt"
]

que me diz que eu instalei gnuplotusando:

brew install --with-qt gnuplot 

Essa deve ser a resposta.
Jacob Degeling

for package in $(brew list); do echo -n "brew install $package "; for item in $(brew info --json=v1 $package | jq -r '.[0].installed[0].used_options | .[]'); do echo -n "$item "; done; echo ; done 2>/dev/null pode ser usado para gerar uma lista de comandos de instalação de distribuição que você pode usar em outro lugar.
Sankalp

4

Outra ferramenta útil é homebrew-bundler. Uma vez instalado via brew tap Homebrew/bundle, você pode executar brew bundle dumpe ele criará um arquivo Brewfile que lista todos os pacotes que você instalou, juntamente com quaisquer argumentos adicionais usados ​​para instalá-los.


Esta é realmente uma boa opção. Além disso, editar Brewfilee fazer o check-in no repositório do dotfiles facilita a configuração de novas máquinas. No entanto, lista todos os pacotes, incluindo todas as dependências. No momento, estou tendo que analisar a lista de uma brew leaveslista que lista apenas os pacotes instalados de nível superior.
precisa saber é o seguinte

3

Aqui está uma pequena função bash que retorna os sinalizadores, independentemente de o pacote ter sido construído a partir da fonte ou não.

function brew_options()
{
    [ "$#" -ne 1 ] && >&2 echo -e "$FUNCNAME requires only 1 option, the package name" && return 1

    local item=$1
    local opts

    ## Check if package installed
    [ -n "$(brew ls --versions $item)" ] || ( >&2 echo -e "$item is not installed" && return 1 )

    set -o pipefail

    ## Get options if built from source
    if ! opts="$(brew info $item | grep 'Built from source with:' | sed 's/^[ \t]*Built from source with:/ /g; s/\,/ /g')" ; then
        # If not built from source, get options from brew metadata
        opts="$(brew info --json=v1 $item | jq -ec '.[].installed[0].used_options' | awk '{print substr($0, 2, length($0) - 2)}' | sed 's/,/ /g;s/"//g')"
    fi

    ## If we're able to get options and its just not spaces echo it 
    if [ "$?" -eq 0 ] && [[ ! -z "${opts// }" ]]; then
        echo "$opts"
    fi

    set +o pipefail

}

Para usar esta função bash em um script bash, escreva

 brew_options PKGNAME

onde PKGNAMEé o nome do pacote homebrew desejado. Você também pode percorrer todos os pacotes homebrew instalados em um script bash, como

 # Command to generate install script
 PKGS=$(brew list)

 # iterate through all packges
 for PKG in $PKGS; do

   echo $PKG `brew_options $PKG`

 done

.


nota depencency: jqprocessador JSON de linha de comando
l --marc l
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.