我应该如何手动将 homebrew 安装到 /usr/local 子目录中?

bro*_*its 3 shell command-line homebrew installation macos

docs.brew.sh 中的手动安装说明/usr/local非常简短且不能令人满意,如果我在不使用 的子目录中尝试它,则会导致一些错误sudo这个问题中的方向及其接受的答案要好一些,但如果不使用 也无法工作sudo

我知道我可能需要使用sudo来安装 Homebrew 本身,但希望我不需要继续使用sudo来安装新软件包、更新等(标准 Homebrew 安装脚本似乎使用,sudo但仅在绝对必要时使用,而标准结果是无需使用sudo来安装新包、更新等)

我应该如何手动将 Homebrew 安装到/usr/local子目录中?

手动安装 info/usr/local子目录的动机:

  • 手动安装使我能够最好地控制 Homebrew 的安装和管理过程。
  • 安装到我的主目录的子目录中并不理想,因为 Homebrew 管理本地构建的包和系统范围的包的组合。

避免用户sudo安装后使用的动机:

  • 与标准安装的一致性
  • 更容易管理现有的 Homebrew 软件包
  • 如果 Homebrew 本身或 Homebrew 软件包不强制用户以 root 身份运行某些内容,则安全风险较低

bro*_*its 5

注意:此答案假设 macOS 用户设置为管理员。请参阅重要说明:

重要提示:除非绝对必要,否则请勿使用,sudo如下所述。最终结果应该是不需要sudo再次使用的 Homebrew 安装。

截至 2021 年 6 月的推荐方法:

用于sudo创建一个子目录,例如opt可以安装 Homebrew 的子目录,并根据需要使用您自己的登录密码:

sudo mkdir /usr/local/opt
Run Code Online (Sandbox Code Playgroud)

sudo 只需再次执行 sudo即可获得该staff组下子目录的所有权,例如:

sudo chown brodybits:staff /usr/local/opt
Run Code Online (Sandbox Code Playgroud)

此时sudo应该不再需要安装或使用 Homebrew。

ls -al /usr/local现在应该显示新的子目录,例如:

total 0
drwxr-xr-x   5 root       wheel  160 May 13 17:13 .
drwxr-xr-x@ 11 root       wheel  352 Jan  1  2020 ..
-rw-r--r--   1 root       wheel    0 Oct 16  2018 .com.apple.installer.keep
drwxr-xr-x   4 root       wheel  128 May 13 17:13 bak
drwxr-xr-x   2 brodybits  staff   64 May 13 17:03 opt
Run Code Online (Sandbox Code Playgroud)

Homebrew/brew现在使用 Git从 GitHub克隆到新的子目录中,例如:

cd /usr/local/opt
git clone https://github.com/Homebrew/brew
ls -al /usr/local/opt # recommended
Run Code Online (Sandbox Code Playgroud)

brew可选:如果需要,可以重命名新安装的子目录。也可以选择将新的brew子目录移动到该/usr/local级别(sudo为此可能只需要再次移动)。

更新所需的配置文件($HOME/.zprofile例如$HOME/.zshenv,如果是 zsh)以将新的 Homebrewbin子目录添加到PATH环境变量中。这是一个例子:

export PATH=/usr/local/opt/brew/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

(另请参阅此答案。)

重新启动 shell、启动新 shell 或获取配置文件。建议检查是否将which brew其显示在正确的位置, /usr/local/opt/brew/bin/brew

此时,应该显示一些信息(此时brew --version尚未安装),例如:homebrew-core

Homebrew 3.1.7-36-g7c68b17
Homebrew/homebrew-core N/A
Run Code Online (Sandbox Code Playgroud)

然后运行brew update以包含homebrew-core并运行brew doctor以验证安装是否正确。它可能会输出一些有关非标准 Homebrew 前缀的警告消息,但这对于大多数软件包来说应该是一个问题。

brew --versionafterbrew doctor应显示homebrew-core包含,例如:

Homebrew 3.1.7-36-g7c68b17
Homebrew/homebrew-core (git revision 61cc59c956; last commit 2021-05-13)
Run Code Online (Sandbox Code Playgroud)

尝试安装一个简单的公式,例如autoconf

brew install autoconf
Run Code Online (Sandbox Code Playgroud)

autoconf --version现在应该显示它已安装。

请参阅下文了解一些可选的后续步骤。


2018 年以来的过时解决方案不再测试或更新

/usr/local首先在using中创建一个临时目录sudo(如果需要,请输入密码):

sudo mkdir /usr/local/brewtmp1
Run Code Online (Sandbox Code Playgroud)

检查以下结果ls -l /usr/local

total 0
drwxr-xr-x   2 root       wheel   64 Jul  2 16:16 brewtmp1
Run Code Online (Sandbox Code Playgroud)

修复临时目录的用户和组所有权:

sudo chown $USER:admin brewtmp1
Run Code Online (Sandbox Code Playgroud)

再次检查结果ls -l /usr/local

total 0
drwxr-xr-x   2 brodybits  admin   64 Jul  2 16:16 brewtmp1
Run Code Online (Sandbox Code Playgroud)

然后在临时目录中下载并解压GitHub 上 Homebrew/brewmaster分支的内容,而不使用 sudo

cd /usr/local/brewtmp1
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz
Run Code Online (Sandbox Code Playgroud)

ls -l检查以下结果/usr/local/brewtmp1

total 0
drwxr-xr-x  16 brodybits  admin  512 Jul  2 14:46 Homebrew-brew-cbc3184
Run Code Online (Sandbox Code Playgroud)

检查以下结果ls -l Homebrew-brew-*

total 48
-rw-r--r--   1 brodybits  admin    98 Jul  2 14:46 CHANGELOG.md
-rw-r--r--   1 brodybits  admin  3161 Jul  2 14:46 CODE_OF_CONDUCT.md
-rw-r--r--   1 brodybits  admin   720 Jul  2 14:46 CONTRIBUTING.md
-rw-r--r--   1 brodybits  admin  1334 Jul  2 14:46 LICENSE.txt
drwxr-xr-x   7 brodybits  admin   224 Jul  2 14:46 Library
-rw-r--r--   1 brodybits  admin  7374 Jul  2 14:46 README.md
drwxr-xr-x   3 brodybits  admin    96 Jul  2 14:46 bin
drwxr-xr-x   5 brodybits  admin   160 Jul  2 14:46 completions
drwxr-xr-x  48 brodybits  admin  1536 Jul  2 14:46 docs
drwxr-xr-x   5 brodybits  admin   160 Jul  2 14:46 manpages
Run Code Online (Sandbox Code Playgroud)

这应该显示具有正确用户和组的 Homebrew 内容。

重命名Homebrew-brew-???????homebrew (不使用sudo(使用其他名称应该可以,并适应以下其他步骤):

mv Homebrew-brew-??????? homebrew
Run Code Online (Sandbox Code Playgroud)

并仔细检查以下结果ls -l

total 0
drwxr-xr-x  16 brodybits  admin  512 Jul  2 14:46 homebrew
Run Code Online (Sandbox Code Playgroud)

使用以下命令将新homebrew目录移动到正确的位置sudo

sudo mv /usr/local/brewtmp1/homebrew /usr/local
Run Code Online (Sandbox Code Playgroud)

仔细检查以下结果ls -l /usr/local

total 0
drwxr-xr-x   2 brodybits  admin   64 Jul  2 16:20 brewtmp1
drwxr-xr-x  16 brodybits  admin  512 Jul  2 14:46 homebrew
Run Code Online (Sandbox Code Playgroud)

将以下行添加到配置文件(.profile.bash_profile适当的情况下)(按照另一个问题的答案的指示):

export PATH=/usr/local/homebrew/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

重新启动 shell、启动新 shell 或获取配置文件。检查which brew显示/usr/local/homebrew/bin/brew. 检查是否brew --version有效(尽管没有homebrew-core安装),例如:

Homebrew >=1.4.0 (shallow or no git repository)
Homebrew/homebrew-core N/A
Run Code Online (Sandbox Code Playgroud)

建议brew doctor此时执行此操作,其中包括homebrew-core并验证安装是否正确。它可能会输出有关非标准 Homebrew 前缀的警告,但这对于大多数软件包来说应该是一个问题。然后brew --version应该显示homebrew-core包含:

Homebrew >=1.4.0 (shallow or no git repository)
Homebrew/homebrew-core (git revision 2f937; last commit 2018-07-02)
Run Code Online (Sandbox Code Playgroud)

尝试安装一个简单的公式,例如autoconf

brew install autoconf
Run Code Online (Sandbox Code Playgroud)

autoconf --version现在应该显示它已安装。

ls -l /usr/local/homebrew现在应该看起来像这样:

total 48
-rw-r--r--   1 brodybits  admin    98 Jul  2 16:43 CHANGELOG.md
-rw-r--r--   1 brodybits  admin  3161 Jul  2 16:43 CODE_OF_CONDUCT.md
-rw-r--r--   1 brodybits  admin   720 Jul  2 16:43 CONTRIBUTING.md
drwxr-xr-x   3 brodybits  admin    96 Jul  2 16:43 Cellar
-rw-r--r--   1 brodybits  admin  1334 Jul  2 16:43 LICENSE.txt
drwxr-xr-x   8 brodybits  admin   256 Jul  2 16:43 Library
-rw-r--r--   1 brodybits  admin  7374 Jul  2 16:43 README.md
drwxr-xr-x  10 brodybits  admin   320 Jul  2 16:43 bin
drwxr-xr-x   5 brodybits  admin   160 Jul  2 16:43 completions
drwxr-xr-x  48 brodybits  admin  1536 Jul  2 16:43 docs
drwxr-xr-x   3 brodybits  admin    96 Jul  2 16:43 etc
drwxr-xr-x   5 brodybits  admin   160 Jul  2 16:43 manpages
drwxr-xr-x   4 brodybits  admin   128 Jul  2 16:43 opt
drwxr-xr-x   8 brodybits  admin   256 Jul  2 16:43 share
drwxr-xr-x   3 brodybits  admin    96 Jul  2 16:42 var
Run Code Online (Sandbox Code Playgroud)

现在建议添加一些可能丢失的目录并修复一些目录权限以匹配 Homebrew 安装脚本的结果(我希望brew doctor检查并提出处理这部分):

cd /usr/local/homebrew
mkdir -p include Caskroom Cellar lib opt share var
chmod g+w include Caskroom Cellar lib opt share var
Run Code Online (Sandbox Code Playgroud)

最后进行清理/usr/local/brewtmp1(使用sudo):

sudo rm -rf /usr/local/brewtmp1
Run Code Online (Sandbox Code Playgroud)

可选的后续步骤:

要禁用分析(感谢这篇文章,必须在安装软件包后完成):

brew analytics off
Run Code Online (Sandbox Code Playgroud)

您可以Homebrew/homebrew-cask-versions访问替代版本,例如每日版本和测试版,正如他们所记录的:

brew tap homebrew/cask-versions
Run Code Online (Sandbox Code Playgroud)

2018 年的其他阅读材料和其他资源: