Bestimmen Sie die Flags, die für Pakete vergeben wurden, die mit Homebrew installiert wurden

17

Gibt es eine Möglichkeit zu überprüfen, welche Flags bei der Installation eines Pakets mit Homebrew vergeben wurden?

Zum Beispiel hat die Emacs-Formel eine absurde Anzahl von Flags. Wenn ich es tat

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

Ich möchte später feststellen, dass ich für die Homebrew-Installation von Emacs die Flags --with-glib --with-librsvgund keine anderen Flags gegeben habe.

Testfall mit lua Paket:

Vor der Installation des Pakets werden in info alle Optionen angezeigt.

$ 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

Ich installiere das Paket nur mit der --with-completionFlagge.

$ 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

Nach der Installation des Pakets zeigt info alle Optionen an, einschließlich derer, die ich nicht verwendet habe. Der Befehl bestätigt, dass das Paket aus der Quelle erstellt und nicht aus einer Flasche gegossen wurde.

$ 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
Praxeolitische
quelle

Antworten:

15

Wenn ein Paket aus dem Quellcode erstellt wird, werden die zum Erstellen verwendeten Flags angezeigt, wenn Sie dies tun brew info <package>.

In diesem Fall: brew info emacs | grep "Built from source"

André
quelle
In der Ausgabe von brew info werden immer alle verfügbaren Optionen für die Formel aufgeführt, nicht die Optionen, die bei der Installation des Pakets verwendet wurden.
Praxeolitic
1
Das ist nicht wahr. Die Informationen geben an, ob das Paket aus einer Flasche installiert oder aus dem Quellcode erstellt wurde. Wenn es aus dem Quellcode erstellt wurde, werden die verwendeten Flags angezeigt.
André
Bearbeitetes OP mit einem Beispiel, in dem info, soweit ich das beurteilen kann, nicht die Flags angibt, die für ein aus dem Quellcode erstelltes Paket verwendet werden.
Praxeolitic
2
Oh hoppla, ich sehe es und dein grep Befehl macht jetzt Sinn.
Praxeolitic
6

/usr/local/CellarUnter jedem Paket befindet sich eine Datei , die aufgerufen wird INSTALL_RECEIPT.json, zB für gawk:

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

das definiert, wie das Paket installiert wurde. Ich denke, die richtige Art, darauf zuzugreifen, ist mit

brew info --json=v1 <packagename>

z.B

brew info --json=v1 gnuplot

Das spuckt eine Menge Zeug aus, aber wenn Sie es durchschicken jq(JSON-Prozessor - handlich verfügbar über homebrew), können Sie die Optionen auswählen, mit denen Sie das Paket wie folgt installiert haben (überprüfen Sie das gnuplotPaket):

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

was mir sagt, dass ich installiert habe gnuplotmit:

brew install --with-qt gnuplot 
Mark Setchell
quelle
Das sollte die Antwort sein.
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 kann verwendet werden, um eine Liste von Brew-Installationsbefehlen auszugeben, die Sie an anderer Stelle verwenden können.
Sankalp
4

Ein weiteres nützliches Werkzeug ist homebrew-bundler. Nach der Installation über brew tap Homebrew/bundlekönnen brew bundle dumpSie das Programm ausführen und eine Brewfile-Datei erstellen, in der alle von Ihnen installierten Pakete zusammen mit zusätzlichen Argumenten aufgelistet sind, die für die Installation verwendet wurden.

rmarscher
quelle
Dies ist in der Tat eine gute Option. BrewfileWenn Sie das bearbeiten und in Ihr dotfiles-Repo einchecken, können Sie ganz einfach neue Maschinen "einrichten". Es werden jedoch alle Pakete einschließlich aller Abhängigkeiten aufgelistet. Ich muss derzeit die Liste aus einer brew leavesListe analysieren, die nur die obersten installierten Pakete auflistet.
Eduncan911
3

Hier ist eine kleine Bash-Funktion, die die Flags zurückgibt, unabhängig davon, ob das Paket aus dem Quellcode erstellt wurde oder nicht.

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

}

Um diese Bash-Funktion in einem Bash-Skript zu verwenden, schreiben Sie

 brew_options PKGNAME

wo PKGNAMEist der gewünschte Homebrew-Paketname. Sie können auch alle installierten Homebrew-Pakete innerhalb eines Bash-Skripts als durchlaufen

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

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

   echo $PKG `brew_options $PKG`

 done

.

Killeroid
quelle
Hinweis zur Abhängigkeit: jqBefehlszeilen-JSON-Prozessor
l