Dive into Hacking with Ham!

Hello, Homebrew!

April 02, 2019

brew image

macOSをお持ちの皆さん、こんにちは。Udemyのプログラミングおじさん、はむです。

さて、今回は、macOSユーザの必須アイテム、Homebrewのご紹介をしていきます。 このHomebrewは、brewと短く呼ぶこともありますので、以降は短い方で呼んでいきますね。このbrewの公式サイトの日本語のページはこちらになります。

Homebrew top page

今回、なぜ、brewを紹介するのかと言うと、 このbrewはですね、macOSのために開発されたパッケージマネージャーなんですね。 このbrewを使って、rbenvとかrubyとかあるいは、nodenvとかyarnと言ったウェブ開発者にとって欠かせないパッケージをインストールしていくことができます。

Linuxを使ったことのある方であれば、CentOSであればyumコマンド、あるいは、Ubuntuであればapt-getコマンドなどでパッケージのインストールをしたことがある人もいるかもしれませんが、要するにそれです。 macOSでもyumやapt-getと同じように、このbrewを一度入れてしまえば、煩わしい パッケージのインストールをコマンドライン一発で進めていけるというのはプログラマーにとって非常にありがたいですよね。

なのでね、macを持っている大抵のプログラマーは、macを買ってきて、電源を入れたらすぐにこのbrewをインストールする!っていっても過言じゃないくらいの鉄板のツールとなっています。インストールも簡単なので、まだ使ったことがないと言う方は是非この機会に入れてみてください。

では、brewコマンドをインストールをしていきますが、まず、インストール前に、コマンドがないこと確かめておきますね。

画面右上のSpotlight検索のアイコンをクリックして、Terminal.appと入力して、ターミナルを開きます。

spotlight search
$ type brew
-bash: type: brew: not found

brewについてもtype コマンドでコマンドがあるかどうかみてみると、この通り、not foundって表示されますよね。 デフォルトの状態だとありません。

install

なので、こちらのHomebrewのリンクをクリックして、Homebrewのトップページに移ってですね、 「インストール」のところにある、こちらのrubyのコマンドをコピーしてターミナルに貼り付けましょう!

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew
:
:
:
:
:
==> The Xcode Command Line Tools will be installed.

Press RETURN to continue or any other key to abort

すると、あとはインストーラが走って、 上のところで処理が止まります。 上では、「Xcodeコマンドラインツールをインストールしますけど、続けても良いならRETURNを押してね!」って言っています。 「Xcodeコマンドラインツール」というのはbrewを使用する上での必要な機能になりますので、指示通りRETURNを押して進めます。

==> /usr/bin/sudo /bin/chmod u+rwx /usr/local/bin
Password:

RETURNを押すと、また即座に処理が停止します。 これは、/usr/local/binというパスに読み書き実行のための権限を付与する操作を行うためにsudo権限が求められています。

$ ls -l /usr/local
total 0
drwxr-xr-x  3 root  wheel  96 Mar 30 12:44 bin

ちなみに、今現在の状態は、別のターミナルで確認すると、ご覧のようになっています。 読んだり、実行したりは、できるんですが、書き込み権限は、僕には無いです。 書き込み権限はrootユーザ、あるいは、wheelグループに所属しているユーザだけに限ります。

==> /usr/bin/sudo /bin/chmod u+rwx /usr/local/bin
Password:

と表示されているように権限の変更をするように求められているんですね。

このコマンドを実行している人にadminになる権限がある場合は、ここでpasswordを入力してEnterを押します。 すると、インストールが進行します。 ここは時間がかかるところなので、brewではないですけれども、コーヒーでも飲んで一服しましょう。

:
:
:
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations
==> Next steps:
- Run `brew help` to get started
- Further documentation:
    https://docs.brew.sh

すると、Installation successfulという案内が表示されます。 ここまで来たら正常にbrew がインストールされたことになります。 brew helpと入力してエンターキーを押してみましょう。

$ brew help
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

brew helpを実行すると、ご覧のようにbrew コマンドに関するヘルプが表示されます。 あとは適宜必要なパッケージをインストールするだけです。

では、折角なので、brewを使ってパッケージのインストールを行ってみましょう。brewでインストールできる有名なパッケージにwgetというファイルダウンローダがありますのでこれを入れてみましょう。まず、デフォルトだとwgetコマンドはmacOS にはインストールされていませんのでtypeコマンドで確認しておきます。

$ type wget
-bash: type: wget: not found

はい、この通りwgetコマンドは見つかりませんでした。では、brewコマンドでwgetコマンドを検索してみます。

$ brew search wget
==> Formulae
wget        wgetpaste

検索するには、brewのサブコマンドであるsearch、そして引数にwgetを渡します。 すると、検索結果にwgetが表示されましたね。 wgetパッケージの詳細をbrew infoコマンドで調べてみましょう。

$ brew info wget
wget: stable 1.20.1 (bottled), HEAD
Internet file retriever
https://www.gnu.org/software/wget/
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/wget.rb
==> Dependencies
Build: pkg-config ✘
Required: libidn2 ✘, openssl ✘
==> Options
--HEAD
	Install HEAD version
==> Analytics
install: 160,363 (30 days), 494,408 (90 days), 1,428,639 (365 days)
install_on_request: 140,903 (30 days), 426,829 (90 days), 1,244,784 (365 days)
build_error: 0 (30 days)

brew info wgetを実行すると、色々と情報が表示されました。 ここで分かるのは、公式のページが https://www.gnu.org/software/wget/ であることですね、そして、 Not installed と表示されています。インストールされていませんよ。ということですね。 公式ページをみてみると、wget の概要について書かれています。

では、wgetをbrewでインストールしてみましょう。実行するコマンドは、brew install wgetです。

$ brew install wget
==> Installing dependencies for wget: gettext, libunistring, libidn2 and openssl
==> Installing wget dependency: gettext
==> Downloading https://homebrew.bintray.com/bottles/gettext-0.
######################################################################## 100.0%
==> Pouring gettext-0.19.8.1.high_sierra.bottle.tar.gz
==> Caveats
gettext is keg-only, which means it was not symlinked into /usr/local,
because macOS provides the BSD gettext library & some software gets confused if both are in the library path.

If you need to have gettext first in your PATH run:
  echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile

For compilers to find gettext you may need to set:
  export LDFLAGS="-L/usr/local/opt/gettext/lib"
  export CPPFLAGS="-I/usr/local/opt/gettext/include"

==> Summary
🍺  /usr/local/Cellar/gettext/0.19.8.1: 1,935 files, 16.9MB
==> Installing wget dependency: libunistring
==> Downloading https://homebrew.bintray.com/bottles/libunistri
######################################################################## 100.0%
==> Pouring libunistring-0.9.10.high_sierra.bottle.tar.gz
🍺  /usr/local/Cellar/libunistring/0.9.10: 54 files, 4.4MB
==> Installing wget dependency: libidn2
==> Downloading https://homebrew.bintray.com/bottles/libidn2-2.
######################################################################## 100.0%
==> Pouring libidn2-2.1.1a.high_sierra.bottle.tar.gz
🍺  /usr/local/Cellar/libidn2/2.1.1a: 69 files, 691.6KB
==> Installing wget dependency: openssl
==> Downloading https://homebrew.bintray.com/bottles/openssl-1.
######################################################################## 100.0%
==> Pouring openssl-1.0.2r.high_sierra.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the SystemRoots
keychain. To add additional certificates (e.g. the certificates added in
the System keychain), place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

openssl is keg-only, which means it was not symlinked into /usr/local,
because Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries.

If you need to have openssl first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

For compilers to find openssl you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl/include"

==> Summary
🍺  /usr/local/Cellar/openssl/1.0.2r: 1,795 files, 12.1MB
==> Installing wget
==> Downloading https://homebrew.bintray.com/bottles/wget-1.20.
######################################################################## 100.0%
==> Pouring wget-1.20.1_4.high_sierra.bottle.tar.gz
🍺  /usr/local/Cellar/wget/1.20.1_4: 49 files, 3.9MB
==> `brew cleanup` has not been run in 30 days, running now...
Pruned 0 symbolic links and 2 directories from /usr/local
==> Caveats
==> gettext
gettext is keg-only, which means it was not symlinked into /usr/local,
because macOS provides the BSD gettext library & some software gets confused if both are in the library path.

If you need to have gettext first in your PATH run:
  echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile

For compilers to find gettext you may need to set:
  export LDFLAGS="-L/usr/local/opt/gettext/lib"
  export CPPFLAGS="-I/usr/local/opt/gettext/include"

==> openssl
A CA file has been bootstrapped using certificates from the SystemRoots
keychain. To add additional certificates (e.g. the certificates added in
the System keychain), place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

openssl is keg-only, which means it was not symlinked into /usr/local,
because Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries.

If you need to have openssl first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

For compilers to find openssl you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl/include"
==> gettext
gettext is keg-only, which means it was not symlinked into /usr/local,
because macOS provides the BSD gettext library & some software gets confused if both are in the library path.

If you need to have gettext first in your PATH run:
  echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile

For compilers to find gettext you may need to set:
  export LDFLAGS="-L/usr/local/opt/gettext/lib"
  export CPPFLAGS="-I/usr/local/opt/gettext/include"

はい、以上で、wgetのインストールはできたんですが、wgetが依存するパッケージに、gettextというパッケージがあるようですが、macOSにも標準で用意されている古いパッケージが存在するようですが、マシンの中に複数のバージョンのパッケージがあると言うことになるわけなんですが、これをbrewがインストールした方を適用する場合には、PATHの設定をしてくださいねって言うのがこちらのメッセージになります。 こちらについては、画面にも表示されているechoコマンドを実行して、PATHの設定変更を行っておく必要があります。

  echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile

そして、これは、将来的に、何かしらのコンパイル作業をする際に、コンパイラに環境変数を渡す場合に、gettextはここにありますよって教えてあげるために LDFLAGSとCPPFLAGSの設定を変更しておきましょうというガイドラインが表示されています。 LDFLAGSとCPPFLAGSの設定については本レクチャーでは行いませんが、今後、何かしらのビルド作業などで、gettextが提供するライブラリのパスを指定する場面になった時に、この設定があったことを思い出して、適切に設定を適用してください。

続いて、opensslの方の画面出力も見ておきましょう。

==> openssl
A CA file has been bootstrapped using certificates from the SystemRoots
keychain. To add additional certificates (e.g. the certificates added in
the System keychain), place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

openssl is keg-only, which means it was not symlinked into /usr/local,
because Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries.

If you need to have openssl first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

For compilers to find openssl you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl/include"

opensslについてもmacOS標準の古いものと競合するようです。なので、brewでインストールした方の優先度を高めるために、

  echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

の実行を行います。 そして、最後の2行も先ほどのgettextのライブラリと同様に、環境変数を設定することでopensslのライブラリのパスを指定することができますので、 こちらもいますぐ何かをやるというものではないのですが、必要な場面が訪れた際に、適切に、LDFLAGSとCPPFLAGSの各フラグを設定できるようにしておきましょう。

で、各PATHの変更を行ったら一旦ログアウトして、ログインをし直して、.bash_profileをロードし直してください。 すると、新しいPATHが適用されます。そしたら、envコマンドで環境変数を出力して、PATHでgrepしてみましょう。

$ env|grep PATH
PATH=/usr/local/opt/openssl/bin:/usr/local/opt/gettext/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

こんな感じで、opensslのbinや、gettextのbinが、brewが提供するパスとして先頭の方に設定されていることが確認できたら設定はきちんとできているということになります。

はい、では少し脱線してしまいましたが、wgetのインストール作業は完了です。 wget のバージョンを確認してみましょう。

$ wget --version
GNU Wget 1.20.1 built on darwin17.7.0.

では、バージョンが確認できたら、wgetの動作を確認しましょう。

$ mkdir tmp
$ cd tmp
$ wget http:/example.com/
$ cat index.html
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
:
:
:
:

tmpディレクトリを作成して移動します。 そして、 http:/example.com/ というサイトのindex.htmlをwgetで取得してみようと思います。 取得できたらcatコマンドでhtmlの中身を表示します。 はい、こんな感じの内容が表示されるかと思います。 wgetの動作も問題なさそうですね。

と言うわけで、本レクチャーでは、macOSユーザのための鉄板ツールHomebrewのインストール手順のご紹介でした。


Ham

プログラミングおじさんのHamです。 このサイトではプログラミングに関する様々な記事や動画レクチャー等をお届けしています。 また、Udemy にて、ウェブプログラミング関連のコース(React・Redux/webpack/GraphQLなど)を絶賛配信中です。より体系的に学習したい方にオススメのコースです。