使用 Homebrew 让从 Mac 切换到 Linux 更轻松

无论您是想简化从 Mac 到 Linux 的迁移,还是仅仅不喜欢标准的 Linux 包管理器,都可以尝试一下 Homebrew。
96 位读者喜欢这篇文章。
Digital images of a computer desktop

Opensource.com

Homebrew 项目最初是作为 Mac 的非官方 Linux 风格包管理器而开始的。它的用户很快就爱上了它友好的界面和有用的提示,并且——在看似奇怪的命运转折中——它被移植到了 Linux。

起初,macOS 和 Linux 有两个独立的项目(Homebrew 和 Linuxbrew),但现在 Homebrew 的核心同时管理这两个操作系统。因为我一直在进行从 Mac 迁移到 Linux 的旅程,所以我一直在研究我最喜欢的 macOS 开源应用程序在 Linux 上的表现,并且我很高兴地发现 Homebrew 对 Linux 的支持确实很出色。

为什么要在 Linux 上使用 Homebrew?

对于长期使用 Linux 的用户来说,对 Homebrew 的第一个合理反应是:“为什么不直接使用……”接下来的词是他们首选 Linux 版本的包管理器。基于 Debian 的系统已经有了 apt,基于 Fedora 的系统有 dnfyum,而像 Flatpak 和 AppImage 这样的项目致力于弥合差距,在两者上都能流畅运行。我花了很多时间使用所有这些技术,我不得不说每一种技术本身都很强大。

那么我为什么要坚持使用 Homebrew 呢?首先,它对我来说非常熟悉。当我过渡到更多开源替代方案来替代我过去使用的专有工具时,我已经学到了很多东西,保持一些熟悉的东西——比如 Homebrew——可以帮助我一次专注于学习一件事,而不是被操作系统之间的所有差异压倒。

此外,我还没有见过像 Homebrew 这样对用户友好的包管理器。命令组织良好,正如默认的帮助输出所示

$ brew -h 
Example usage:
  brew search [TEXT|/REGEX/]
  brew info [FORMULA...]
  brew install FORMULA...
  brew update
  brew upgrade [FORMULA...]
  brew uninstall FORMULA...
  brew list [FORMULA...]

Troubleshooting:
  brew config
  brew doctor
  brew install --verbose --debug FORMULA

Contributing:
  brew create [URL [--no-fetch]]
  brew edit [FORMULA...]

Further help:
  brew commands
  brew help [COMMAND]
  man brew
  https://docs.brew.sh.cn

这种简短的输出可能会被误认为是限制,但快速查看任何子命令的内部都会发现丰富的功能。上面的列表只有 23 行长,但 install 子命令对于高级用户来说,却有惊人的 79 行信息可用

$ brew --help | wc -l 
23
$ brew install --help | wc -l 
79

它具有忽略或安装依赖项的选项,选择从源代码构建以及使用哪个编译器,以及使用上游 Git 提交的确切版本,而不是官方的“瓶装”应用程序版本。可以肯定地说,Homebrew 既适合专家,也适合新手。

开始在 Linux 上使用 Homebrew

如果您想尝试一下 Homebrew,有一个很棒的单行脚本可以在 Mac 或 Linux 上安装它

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

此命令立即执行 Homebrew 安装程序脚本。如果您更谨慎,可以 curl 该文件,然后在审查后手动运行它

$ curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh --output homebrew_installer.sh
$ more homebrew_installer.sh # review the script until you feel comfortable
$ bash homebrew_installer.sh

Linux 说明包括 dotfiles 的配置,特别是 Debian 系统上的 ~/.profile 和 Fedora 上的 ~/.bash_profile

$ test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
$ test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
$ echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile

为了确认安装,Homebrew 团队提供了一个空的 hello 公式用于测试

$ brew install hello
==> Downloading https://linuxbrew.bintray.com/bottles/hello-2.10.x86_64_linux.bottle.tar.gz
######################################################################## 100.0%
==> Pouring hello-2.10.x86_64_linux.bottle.tar.gz
?  /home/linuxbrew/.linuxbrew/Cellar/hello/2.10: 52 files, 595.6KB

看起来我的安装工作正常,没有任何问题,所以我将进一步探索。

用于命令行实用程序的 Brew

Homebrew 自诩为一个应用程序,它“安装了您需要的 [Linux] 默认没有的东西”。

您可以使用 brew 命令安装 Homebrew 中打包的任何命令行实用程序。这些软件包定义称为“formulae”(配方),它们通过“bottles”(瓶子)编译和共享。Homebrew 世界中还有许多其他与啤酒相关的术语,但包管理器的主要目的是使软件易于访问。

什么样的软件?想想那些对像我这样的书呆子(以及,既然您正在阅读本文,可能也是您)有用的东西。例如,方便的 tree 命令,它可以显示目录结构,或者 pyenv,我用它来管理 Mac 上的多个 Python 版本

您可以使用 search 命令查看所有可用的 formulae,添加 wc 命令可以显示有多少可用

# -l counts the number of lines
$ brew search | wc -l
    5087

迄今为止,有超过 5,000 个 formulae,这是一个惊人的软件数量。需要注意的是,并非每个 formula 都能在 Linux 上运行。brew search --help 的输出中有一个部分显示了按其运行的操作系统过滤软件的标志。它会将每个操作系统的存储库列表启动到浏览器。我正在运行 Fedora,所以我将尝试一下

$ brew search --fedora tree

浏览器加载了 https://apps.fedoraproject.org/packages/s/tree,其中显示了 Fedora 的可用选项。还有其他浏览方式。Formulae 被编纂并集中到核心存储库中,这些存储库按操作系统(Mac 在 Homebrew Core 中,Linux 位在 Linux Core 中)分开。它们也可以通过 Homebrew API 和 网站上列出 获取。

即使有所有这些选项,我仍然通过其他用户的推荐找到我的大多数新工具。如果您正在寻找灵感,这里有一些我最喜欢的

  • pyenvrbenvnodenv 分别用于管理 Python、Ruby 和 Node.js 版本
  • imagemagick 用于可脚本化的图像编辑
  • pandoc 用于可脚本化的文档转换(我经常从 .docx 切换到 .md 或 .html)
  • hub 为 GitHub 用户提供更好的 Git 体验
  • tldr 用于提供如何使用命令行实用程序的示例

要探索 Homebrew,请查看 tldr pages,它是滚动浏览应用程序手册页面的用户友好替代方案。通过运行 search 确认它是否可用

$ brew search tldr
==> Formulae
tldr ✔

成功!复选标记让您知道它可用。现在您可以安装它了

$ brew install tldr
==> Downloading https://linuxbrew.bintray.com/bottles/tldr-1.3.0_2.x86_64_linux.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring tldr-1.3.0_2.x86_64_linux.bottle.1.tar.gz
?  /home/linuxbrew/.linuxbrew/Cellar/tldr/1.3.0_2: 6 files, 63.2KB

Homebrew 提供预构建的二进制文件,因此您不必在本地计算机上从源代码构建。这节省了大量时间和 CPU 风扇噪音。我欣赏 Homebrew 的另一点是,您可以在不确切理解它的含义的情况下欣赏此功能。如果您更喜欢自己构建,请在 brew install 中使用 -s--build-from-source 标志,以从源代码编译 formula(即使 bottle 存在)。

类似地,底层复杂性可能很有趣。在 tldr 上运行 info 可以显示依赖项管理是如何发生的,formula 的源代码在磁盘上的位置,甚至公共分析也可用

$ brew info tldr
tldr: stable 1.3.0 (bottled), HEAD
Simplified and community-driven man pages
https://tldr.sh/
Conflicts with:
  tealdeer (because both install `tldr` binaries)
/home/linuxbrew/.linuxbrew/Cellar/tldr/1.3.0_2 (6 files, 63.2KB) *
  Poured from bottle on 2020-06-08 at 15:56:15
From: https://github.com/Homebrew/linuxbrew-core/blob/master/Formula/tldr.rb
==> Dependencies
Build: pkg-config ✔
Required: libzip ✔, curl ✔
==> Options
--HEAD
	Install HEAD version
==> Analytics
install: 197 (30 days), 647 (90 days), 1,546 (365 days)
install-on-request: 197 (30 days), 646 (90 days), 1,546 (365 days)
build-error: 0 (30 days)

从 Mac 到 Linux 的一个限制

在 macOS 上,Homebrew cask 子命令为用户提供了一种使用相同的出色命令行实用程序安装和管理整个应用程序的方法。不幸的是,cask 尚不适用于任何 Linux 发行版。我在尝试安装开源工具时发现了这一点

$ brew cask install tusk
Error: Installing casks is supported only on macOS

我在论坛上询问了它,并从其他用户那里得到了一些快速反馈。简而言之,选项是

  • Fork 该项目,构建该功能,并向其他人展示它的价值
  • 为应用程序编写 formula 并从源代码构建
  • 为应用程序创建第三方存储库

最后一个对我来说最有趣。Homebrew 通过创建和维护“taps”(另一个受啤酒影响的术语)来管理第三方存储库。当您越来越熟悉系统并想添加到生态系统时,taps 值得探索。

备份 Homebrew 安装

我最喜欢的 Homebrew 功能之一是您可以像任何其他版本控制中的 dotfile 一样备份您的安装。对于此过程,Homebrew 提供了一个 bundle 子命令,其中包含一个 dump 子命令,用于生成 Brewfile。此文件是您当前安装的所有工具的可重用列表。要从您的安装生成 Brewfile,请进入您要使用的任何文件夹并运行

$ cd ~/Development/dotfiles # This is my dotfile folder
$ brew bundle dump
$ ls Brewfile
Brewfile

当我更换机器并想在新机器上设置相同的应用程序时,我转到包含 Brewfile 的文件夹,并使用以下命令重新安装它们

$ ls Brewfile
Brewfile
$ brew bundle

它将在我的新机器上安装所有列出的 formulae。

跨 Mac 和 Linux 的 Brewfile 管理

Brewfile 是备份现有安装的好方法,但是如果 Mac 上的某些东西无法在 Linux 上运行,反之亦然呢?我发现 Homebrew 会优雅地忽略在给定操作系统(无论是 Mac 还是 Linux)上不起作用的行。当它遇到不兼容的请求(例如要求 brew 在 Linux 上安装 casks)时,它会跳过它们并继续前进:

$ brew bundle --file=Brewfile.example

Skipping cask licecap (on Linux)
Skipping cask macdown (on Linux)
Installing fish
Homebrew Bundle complete! 1 Brewfile dependency now installed.

为了尽可能保持我的配置简单,我在两个操作系统上都使用相同的 Brewfile,并且没有遇到任何问题,因为它每次运行都会安装特定于操作系统的版本。

用于包管理的 Homebrew

Homebrew 一直是我首选的命令行实用程序管理器,它的熟悉性让我的 Linux 体验更加愉快。Homebrew 使我保持井井有条和最新状态,并且我继续欣赏它在使用方便性和功能深度之间的平衡。我更喜欢将包管理细节保持在用户需要知道的最少信息量,并且大多数人都会从中受益。如果您已经熟悉 Linux 包管理器,Homebrew 可能会显得很简单,但稍微深入了解一下就会发现它的高级选项远远超出了本文的内容。

Linux 用户有很多包管理选项。如果您来自 macOS 世界,Homebrew 会让您感觉像家一样。

接下来阅读什么
标签
I'm happiest at a microphone
Matt 是一位 EMC 存储专家、VMware vExpert,并且曾经是其他专有技术的粉丝。他现在专注于开源和 DevRel 采用。

2 条评论

嗯。Homebrew 是为了让 Linux 用户在 MacOS 上更舒适。

好吧,我想如果我运行的是 Debian 或其他东西,可能有一些旧软件包,HomeBrew 可能会有点用——但它在 Arch 等系统上真的毫无意义。

优秀的文章。我学到了很多关于 brew 包管理器的知识。感谢分享。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.