[Deprecated] AUR ヘルパーとして（yaourt の代わりに）pacaur を使う

# Yet another Yogurt （2019/01/08 追記）

今更な追記ですが、今は **yay** を使うのが最もよさそうです。

* [Jguer/yay: Yet another Yogurt - An AUR Helper written in Go](https://github.com/Jguer/yay)

---

# pacaur is now unmaintained （2017/12/17 追記）

**pacaur は 2017/12/14 より unmaintained となりました。**

* https://bbs.archlinux.org/viewtopic.php?pid=1755144#p1755144
* https://aur.archlinux.org/packages/pacaur/

> [2017-12-15] This project is now unmaintained. Users are encouraged to move to another solution (see wiki for alternatives).

しばらくは動作するようですが、開発中の pacman 5.1 系がリリースされると問題が生じるとのことです。別の AUR helper に乗り換えることを勧められています。

* https://wiki.archlinux.org/index.php/AUR_helpers

しかしどれに乗り換えればいいのかというとかなり悩ましいですが……。私は yaourt, packer, bauerbill を使ったことがあるのですが、ざっくりとした印象は以下のような感じです（括弧内の数値は現時点での AUR 上での Votes, Popularity）。

* yaourt (2997, 17.11): 利用者がかなり多い、情報も多い
* packer (775, 1.21): 利用者が多い、シンプル、Arch Linux ARM のリポジトリに入っていたりする
* bauerbill (27, 2.07): 多機能、AUR 上のパッケージへの依存が多い、ややコマンドに癖がある

何はともあれお疲れ様でした……。

（追記終わり）

---

**Arch Linux** を使うメリットとして、**Arch User Repository (AUR)** にある大量のパッケージを利用できることが挙げられます。その数 38,798 パッケージ（記事編集時点）。

* [AUR (en) - Home](https://aur.archlinux.org/)

AUR 上のパッケージを手軽にビルド・インストールできるようにするソフトウェアである「AUR ヘルパー」としては yaourt や packer が有名ですが、**pacaur** については日本語記事があんまりなかったので、布教も兼ねて記事にしておくことにしました。

pacaur は **“advanced users”** 向けのソフトであると明言されており、パッケージのビルドプロセスについては充分理解しておく必要があります。PKGBUILD, makepkg, AUR の基本的な使い方については以下の記事が大変参考になります。

* [Arch Linuxとパッケージシステム - Qiita](http://qiita.com/boronology/items/6ea8a4dd540c5980627b)

# pacaur の主な特徴

以下が pacaur の重要な特徴です。

* **ユーザのプロンプト入力が最小限になるように設計されている**
    * PKGBUILD さえ確認すればビルドステップは放置できる！
* **パッケージのメタデータを使ってセキュアに依存関係を解決する**
    * 複雑な依存関係を持つパッケージもストレスフリーにインストールできる！

この記事の後半では実際にその特徴を体感できる例を紹介します。

その他の特徴については公式の GitHub のページとフォーラムのページを熟読しましょう。

* [GitHub - rmarquis/pacaur: An AUR helper that minimizes user interaction](https://github.com/rmarquis/pacaur)
* [pacaur - an AUR helper that minimizes user interaction / Community Contributions / Arch Linux Forums](https://bbs.archlinux.org/viewtopic.php?id=119473)

以下は他の AUR ヘルパーとの比較表です。

<img width="415" alt="AUR ヘルパー" src="https://qiita-image-store.s3.amazonaws.com/0/6899/ed84caf6-bc53-ce5d-93ae-a17821031700.png">

* [AUR helpers - ArchWiki](https://wiki.archlinux.org/index.php/AUR_helpers)
    * [AUR ヘルパー - ArchWiki](https://wiki.archlinuxjp.org/index.php/AUR_%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC)（日本語版）

ちなみに、記事執筆時点で AUR のパッケージを Popularity でソートすると [pacaur が最上位に来ます](https://aur.archlinux.org/packages/?SB=p&SO=d&O=0&PP=50)。

# pacaur をインストールする

pacaur のインストールは以下のような流れで行います。

1. cower 開発者の公開鍵の入手
2. cower と pacaur のインストール
    * 別の AUR ヘルパーからインストールする場合
    * 一からインストールする場合

## cower 開発者の公開鍵の入手

pacaur は cower に依存しており、cower 開発者 Dave Reisner (https://github.com/falconindy) 氏の OpenPGP 公開鍵を入手していないとソースの署名の検証時にエラーになります。

```bash
$ gpg --recv-keys 487EACC08557AD082088DABA1EB2638FF56C0C53
```

GnuPG の詳細な使い方を知りたい場合は ArchWiki を読みましょう。

* [GnuPG - ArchWiki](https://wiki.archlinux.org/index.php/GnuPG)
    * [GnuPG - ArchWiki](https://wiki.archlinuxjp.org/index.php/GnuPG)（日本語版）

## cower と pacaur のインストール

### 別の AUR ヘルパーからインストールする場合

別の AUR ヘルパーが既にインストールされている場合はそれを使って pacaur をインストールしましょう（以下は yaourt の場合）。依存先の cower も一緒にインストールされるはずです。

```bash
$ yaourt -S pacaur
```

### 一からインストールする場合

base-devel, git パッケージが必須です。入っていない環境はほぼ無いとは思いますが念のため。また、makepkg を root で動かすのは推奨されないため、以下の作業は必ず sudo 権限持ちの別ユーザで行ってください。

#### TL;DR

pacaur インストールに必要な全操作は以下の通りです。

```bash
git clone --depth=1 "https://aur.archlinux.org/cower.git"
cd cower
makepkg -si
cd ..

cower -d pacaur
cd pacaur
makepkg -si
```

以下解説。

#### cower を入れる

cower の PKGBUILD をダウンロードし、makepkg してパッケージをインストールします。

```bash
$ git clone --depth=1 "https://aur.archlinux.org/cower.git"
$ cd cower
$ makepkg -si
```

前述の OpenPGP 公開鍵を入手していないと以下のようなエラーが出ます。

```
==> Verifying source file signatures with gpg...
    cower-16.tar.gz ... FAILED (error during signature verification)
==> ERROR: One or more PGP signatures could not be verified!
```

なお、`makepkg -si` の `-s` は `--syncdeps`（依存パッケージを自動でインストールする）、`-i` は `--install`（ビルドしたパッケージをインストールする[^1]）の略記です。

[^1]: ここでは `makepkg -s && sudo pacman -U cower-XX-X-x86_64.pkg.tar.xz` と同義。

最後に cower ディレクトリから抜けておきます。

```bash
$ cd ..
```

#### pacaur を入れる

先ほどインストールした cower を使って AUR から pacaur の PKGBUILD を落としてくるのが手っ取り早いです。cower の時と同様に makepkg してインストールします。

```bash
$ cower -d pacaur
$ cd pacaur
$ makepkg -si
```

#### 参考

* [A simple shell script to quickly / easily install "pacaur" on archlinux]
(https://gist.github.com/Tadly/0e65d30f279a34c33e9b)
* [A small script for arch linux which builds and installs "pacaur" automatically](https://gist.github.com/rumpelsepp/d646750910be19332753)

# 実例：AUR から mikutter をインストールする

pacaur は **“an AUR helper that minimizes user interaction”** を標榜しています。ここでは、大人気 twitter クライアントである mikutter を Arch Linux にインストールする実例を通して、その user interaction の minimize されっぷりを示したいと思います。

## yaourt を使った場合

```bash
$ yaourt -S mikutter
```

まず、従来通り yaourt を使って mikutter をインストールしてみます。

```
mikutter 3.4.8-1  (2016-11-27 07:09)
( Unsupported package: Potentially dangerous ! )
==> Edit PKGBUILD ? [Y/n] ("A" to abort)
==> ------------------------------------
==> 
```

AUR はユーザが自由に PKGBUILD をアップロードできる場所です。 **“Potentially dangerous !”** と yaourt 先生がおっしゃっている通り、悪影響を与えうる PKGBUILD が故意に、あるいはうっかりアップロードされる危険性があります。よって、PKGBUILD の内容確認は必ずしましょう。**y** を入力すると `$EDITOR` で PKGBUILD が開かれるので、確認した後エディタを終了します。

```
==> mikutter dependencies:
 - ruby-gtk2>=2.2.3 (already installed)
 - ruby-moneta (building from AUR)
 - ruby-nokogiri (building from AUR)
 - ruby-httpclient (building from AUR)
 - ruby-mini_portile2 (building from AUR)
 - ruby-totoridipjp (building from AUR)


==> Continue building mikutter ? [Y/n]
==> ------------------
==> 
```

mikutter は AUR の 5 つのパッケージに依存しているため、それらもインストールする必要があります。mikutter のビルドを続行するかどうか聞かれているので **y** を入力します。

```
==> Downloading ruby-httpclient PKGBUILD from AUR...
x .SRCINFO
x PKGBUILD
ruby-httpclient 2.7.1-1  (2016-01-03 20:48)
( Unsupported package: Potentially dangerous ! )
==> Edit PKGBUILD ? [Y/n] ("A" to abort)
==> ------------------------------------
==> 
```

依存パッケージの 1 つである ruby-httpclient の PKGBUILD がダウンロードされてきました。PKGBUILD の確認は必ずしましょう (2)。**y** を入力します。

```
==> Continue building ruby-httpclient ? [Y/n]
==> ------------------
==> 
```
ruby-httpclient をビルドするかどうか聞かれるので、**y** を入力します。

```
==> Continue installing ruby-httpclient ? [Y/n]
==> [v]iew package contents [c]heck package with namcap
==> ---------------------------------------------------
==> 
```

ビルドが終わると yaourt から ruby-httpclient をインストールするかどうか聞かれます。**y** を入力します。

```
Packages (1) ruby-httpclient-2.7.1-1

Total Installed Size:  2.09 MiB

:: Proceed with installation? [Y/n] 
```

pacman にも ruby-httpclient をインストールするかどうか聞かれます。**y** を入力します。

ruby-httpclient のインストールが終わると、次は ruby-mini_portile2 のビルドが始まります。

```
ruby-mini_portile2 2.1.0-11  (2016-09-16 21:38)
( Unsupported package: Potentially dangerous ! )
==> Edit PKGBUILD ? [Y/n] ("A" to abort)
==> ------------------------------------
==>
```

PKGBUILD の確認は必ずしましょう (3)。**y** を入力します。

という感じで、以降、ruby-moneta, ruby-nokogiri, ruby-totoridipjp についても同様の流れでビルドが行われます。うおォン、俺はまるで人間 yes コマンドだ。

また、ruby-nokogiri ビルド時にはその依存パッケージの libxslt のインストールが挟まったりします。

```
==> Install or build missing dependencies for ruby-nokogiri:
resolving dependencies...
looking for conflicting packages...

Packages (1) libxslt-1.1.29+23+geb1030d-1

Total Download Size:   0.35 MiB
Total Installed Size:  2.27 MiB

:: Proceed with installation? [Y/n] 
```

そんな感じでひたすら yaourt & pacman に質問攻めに遭いつつ、ようやく mikutter 本体のインストールへと辿り着きました。

```
==> Continue installing mikutter ? [Y/n]
==> [v]iew package contents [c]heck package with namcap
==> ---------------------------------------------------
==> 
```

総理！ 本当にインストールしますか？ いいですか？（イメージ）

```
Packages (1) mikutter-3.4.8-1

Total Installed Size:  11.16 MiB

:: Proceed with installation? [Y/n] 
```

これが最後の **y** の入力です。ようやく mikutter がインストールされました。お疲れさまでした。

ちなみに、yaourt のプロンプトは y キーの押下のみで動作するのに対し、pacman 由来のプロンプトは y を入力後 Return しないと動作しないので、本当はずっと Return キーだけを押していった方がいいです（バッドノウハウ）。

いくらなんでも yaourt のプロンプトの表示頻度が高すぎる、このままだと yaourt が “Yes” And “Ok” User Repository Tool の略だと思われてしまう……という懸念（杞憂）を抱いたので色々調べたところ、確認を減らす方法があったのでこの記事の最後におまけとして説明しておきます。

## pacaur を使った場合

```bash
$ pacaur -S mikutter
```

それでは、pacaur を使って mikutter をインストールしてみます。

```
:: Package(s) mikutter not found in repositories, trying AUR...
:: resolving dependencies...
:: looking for inter-conflicts...

AUR Packages  (6) mikutter-3.4.8-1  ruby-httpclient-2.7.1-1  ruby-mini_portile2-2.1.0-11  ruby-moneta-0.8.0-2  ruby-nokogiri-1.6.8-2  ruby-totoridipjp-0.1.0-1
Repo Packages (1) libxslt-1.1.29+23+geb1030d-1

Repo Download Size:   0.00 MiB
Repo Installed Size:  2.27 MiB

:: Proceed with installation? [Y/n]
```

この時点でパッケージの依存が解決されており、ruby-nokogiri の依存する libxslt の存在が既に確認できます。

ここで y を入力すると、PKGBUILD のダウンロードが開始されます。

```
:: Retrieving package(s)...
Cloning into 'mikutter'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 2 (delta 0)
Unpacking objects: 100% (6/6), done.
```

また、依存パッケージの PKGBUILD も全てダウンロードされます。

```
Cloning into 'ruby-httpclient'...
...
Cloning into 'ruby-moneta'...
...
Cloning into 'ruby-nokogiri'...
...
Cloning into 'ruby-totoridipjp'...
...
Cloning into 'ruby-mini_portile2'...
...
```

それが終わると、PKGBUILD の内容確認フェイズが始まります。依存パッケージの PKGBUILD の確認も全てこのタイミングで行われます。

```
:: View mikutter PKGBUILD? [Y/n]
...
:: View ruby-httpclient PKGBUILD? [Y/n]
...
:: View ruby-moneta PKGBUILD? [Y/n]
...
:: View ruby-nokogiri PKGBUILD? [Y/n]
...
:: View ruby-totoridipjp PKGBUILD? [Y/n]
...
:: View ruby-mini_portile2 PKGBUILD? [Y/n]
...
```

そして、**ここがユーザの最終入力となります。**PKGBUILD の確認を終えるとビルドが開始され、ビルドが成功すれば自動的に mikutter と依存パッケージが全てインストールされます。お疲れさまでした。

## 比較

yaourt を使った AUR パッケージのインストールの流れは以下のようになります。

1. 指定パッケージの PKGBUILD のダウンロード
2. 指定パッケージの PKGBUILD の内容確認
3. 依存パッケージの PKGBUILD のダウンロード
4. 依存パッケージの PKGBUILD の内容確認
5. 依存パッケージのビルド・インストール
6. 3-5 を繰り返し
7. 指定パッケージのビルド・インストール

依存パッケージが更に別の AUR 上のパッケージに依存していた場合、処理の流れは一層複雑になります。このように、ユーザインタラクションの必要な PKGBUILD 確認フェイズと、時間のかかるビルドフェイズが交互に来てしまうため、ターミナルに張り付きながらパッケージのビルドとインストールを進める必要があります。

一方、pacaur を使うと以下のような流れになります。

1. 指定パッケージの依存関係の解決
2. 指定パッケージと依存パッケージの PKGBUILD のダウンロード
3. 指定パッケージと依存パッケージの PKGBUILD の内容確認
4. 指定パッケージと依存パッケージのビルド・インストール

pacaur の場合、時間のかかるビルドのステップがまとめて最後に来るようになっており、ステップ 3. までの入力を終えれば後は完全放置できます。**これが pacaur を使う最大のメリットです。**

# pacaur のその他の特徴

* バージョンアップ時には PKGBUILD の diff だけが表示されるため、内容確認の手間が格段に減ります。

# 注意点

* ABS サポート（`yaourt -G` に相当する機能）は pacaur にはありません。
* PKGBUILD をゴリゴリ編集する人向けではないとのこと。
    * PKGBUILD の内容確認も “Edit PKGBUILD” ではなくあくまで “View PKGBUILD”。

「yaourt の代わりに」というタイトルですが実際のところ私は yaourt と pacaur を併用しています。

# おわりに

pacaur の解説および布教記事でした。サッと書くつもりでいたのに長い記事になってしまった……。後で気付いたことがあれば追記・訂正します。

Enjoy Arch Linux!

# おまけ：yaourt の確認の頻度を減らす

/etc/yaourtrc または ~/.yaourtrc で `BUILD_NOCONFIRM=1` とすると yaourt の “Continue building *** ?” と “Continue installing *** ?” の確認を省略できます。

```bash:~/.yaourtrc
BUILD_NOCONFIRM=1
```

こうすると、yaourt については PKGBUILD の確認のプロンプト (“Edit PKGBUILD ?”) だけが表示されます（`NOCONFIRM=1` としたり `--noconfirm` オプションを付けたりすることでこのプロンプトも省略できますが、推奨はしません）。

上記の設定をしても、pacman 由来の確認 (“Proceed with installation?”) には対応する必要があります。それすら省略したい場合は、

```bash:/usr/bin/pacman-nc
#!/bin/bash
pacman --noconfirm $@
```

のような `pacman-nc` スクリプトを `/usr/bin/` に置いて `chmod +x` で適切な実行権限を与え、`yaourtrc` で

```bash:~/.yaourtrc
BUILD_NOCONFIRM=1
PACMAN='pacman-nc'
```

とすれば良い感じです。`PACMAN='pacman --noconfirm'` のようにスペースが入っていると動作しないようなので `pacman-nc` スクリプトを用意しました（苦肉の策）。