パッケージ管理ツール porg (2)実践的な利用方法


## 概要
ここに示す情報は前記事「[パッケージ管理ツール porg (1)実践的インストール](https://qiita.com/matsuand/items/2c1c4e5359e1ff033c92)」の続きです。porg の概要やインストールまでの手順はそちらを参照してください。ここでは porg の実践的利用方法を示すことにします。

### 説明の前提
<details><summary>一般ユーザーでも porg による操作、インストールが出来る環境を前提とします。</summary>
前記事「[パッケージ管理ツール porg (1)実践的インストール](https://qiita.com/matsuand/items/2c1c4e5359e1ff033c92)」では「実践的なインストール」や「```/usr/bin/porg``` を一般ユーザーが使うための環境整備」という節を通じて、管理者権限を持たない一般ユーザーが porg を操作できる手順を説明していました。これ以降での説明では、そういった環境を前提とし、一般ユーザーのまま、目的とするパッケージをインストールすることを例示していきます。したがって ```make install``` を管理者権限ではなく実行する例を示すようになりますので、管理者権限を必要とする環境での実行にあたっては ```sudo ... make install``` などのようにする必要がある点に留意しておいてください。</details>

<details><summary>porg の実行オプションはいわゆるショートオプションのみを用いて説明していきます。</summary>
porg は実行オプションを使い分けながら操作していきます。オプションはいろいろありますが、全体にはさほど多くありません。また頻繁に用いる実行オプションとなると、さらに限られてくるため、意外とすぐに覚えられる程度です。
なお getopt の流儀にのっとって、実行オプションにはショートオプション (マイナス記号に英字 1 文字) か、ロングオプション (マイナス記号 2 つに英単語) が、対で存在します。具体的に例えば ショートオプション ```-l``` は、ロングオプションでは ```--log``` となります。以降の説明ではショートオプションのみを示します。ロングオプションについては porg に付属するドキュメント、```man porg```、```porg --help``` を参照してください。</details>

## 実践的な操作
操作方法を体系的に取りまとめるのは二の次にして、ここでは実践的な操作方法を示します。具体例として GNU の [hello-2.10](http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz "hello-2.10.tar.gz") パッケージを用いることにします。

### 典型的な操作(1) パッケージのインストール
porg の操作において何よりも必要になるのが、パッケージをインストールしてそれを porg に登録する操作です。

#### (1a) 全般的な操作

hello パッケージのソースコードに対して ```configure```、```make```、```make install``` を順に実行していく操作の中、```make install``` 実行のときに ```porg``` を用います。オプションは ```-l``` (英小文字のエル) を使います。

```shell-session
$ wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
$ tar xf hello-2.10.tar.gz
$ cd hello-2.10
$ ./configure --prefix=$HOME/usr
$ make
$ porg -lD make install            # D オプション利用、カレントディレクトリをパッケージ名とする
または
$ porg -lp hello-2.10 make install # p オプション利用、パッケージ名を明示する
```
ポイント：

* ```make install``` を実行する際に、このコマンドの前に ```porg``` を用います。これを通じて hello パッケージが porg の管理下に登録されます。
* パッケージを登録する際には ```-l``` (英小文字のエル) オプションを用います。
* ```-l``` オプションには、もう一つオプションをつける必要があります。上で示したように ```D``` (ディー) か ```p``` (ピー) のいずれかです。
*  ```-lD``` オプション
<details><summary>```porg -lD ...``` はカレントディレクトリ名を、そのままパッケージの登録名とするものです。</summary>
上の例の場合、hello パッケージを ```hello-2.10``` というディレクトリに展開して操作をしており、カレントディレクトリは ```hello-2.10``` です。このディレクトリ名を、porg 登録パッケージ名とするものです。</details>
* ```-lp``` オプション
<details><summary>```porg -lp hello-2.10 ...``` は、porg 登録パッケージ名を明示する書式です。</summary>
```-lp``` の後ろに "hello-2.10" という文字列を引数で与えるものです。これが登録パッケージを明示的に指定するものです。
</details>

<details><summary>こうして見てみると、上の 2 つの操作例は、結果的に全く同じ処理結果になります。</summary>
```D``` オプションを利用するのは、パッケージ登録名をいちいち指定するのが面倒だからです。入力を省く手段として ```D``` オプションが用意されていると考えてよいと思います。しかし常々 ```D``` オプションを使えば済むものでもありません。すべてのパッケージが、パッケージ名 (に加えてバージョン番号) というディレクトリ配下にソースコードを収容しているとは限りません。git から入手したソースコードであれば、バージョン番号がないことにもなるでしょうし、ソースビルドをソースディレクトリ以外のビルドディレクトリを用意してビルドするような場合 (むしろこういったケースは多々あります)、もはやカレントディレクトリ名はパッケージ名である保証は全くありません。したがって登録パッケージ名を明示的に指定する ```-lp``` オプションは、必ず利用する場面がでてきます。2 通りの操作方法を覚えておくことにしましょう。
</details>

#### (1b) 追加のインストール操作

<details><summary>```make install``` に続けて、まだインストールするものがあるなら、上で行った登録操作に続けて、**追加の**登録操作を行う必要があります。これを行うには ```-lD+``` または ```-lp+``` オプションを用います。</summary>
一般に、パッケージの中には ```make install``` だけでは、全てのパッケージ内容がインストールされないものもあります。```make install-html``` などを必要とするパッケージがあるのもその一例です。
インストール処理に必要なコマンドが複数分かれていたとしても (```make install``` 以外にインストールのためのコマンド実行が必要であったとしても)、同一の登録パッケージ名の元に、追加で登録していくためのオプションが ```-lD+ ...``` または ```-lp+``` です。(1a) での操作における ```-lD``` または ```-lp``` オプションにさらに ```+``` (プラス記号) をつけます。

<details><summary>以下では hello パッケージのドキュメントを、追加でインストールすることにします。</summary>
インストールする操作そのものは、インストール先ディレクトリを生成して (```mkdir ...```)、そこにソースディレクトリ内のドキュメントをコピーする (```cp -R ...```) という単純なものです。</details>
<details><summary>意外に思われるかもしれませんが、```make install``` だけがインストールではありません。```cp``` コマンドに対しても porg を利用します。</summary>
porg のドキュメントなどを見ても、```porg -lD make install``` といったように ```make install``` ばかりが例に出てきますが、インストールするコマンドは何も ```make install``` だけではありません。```cp``` だって ```mv``` だって、パッケージにとって必要なファイルであれば、そのコマンドもインストール処理になるわけです。
porg の頼りになるところは、porg ユーザーが「このコマンドによってパッケージをインストールするから、そのことを記録しておけよ」と指示してくることに対して、そのとおりに記録してくれるところです。コマンドは基本的に何でもよいのです。</details>

```shell-session:(1a)の続き
$ pwd           # カレントディレクトリは hello-2.10 であることを確認
hello-2.10

$ mkdir -p $HOME/usr/share/doc/hello-2.10
$ porg -lD+ cp doc/* $HOME/usr/share/doc/hello-2.10
または
$ porg -lp+ hello-2.10 cp doc/* $HOME/usr/share/doc/hello-2.10
```

ポイント

* まず porg への追加の登録操作は、登録操作ということで、前と同様に ```-lD``` か ```-lp``` のいずれかを用います。
* さらに追加の登録であることを示すために ```+``` (プラス記号) を付与して ```-lD+``` か ```-lp+``` というオプション指定にします。
* こうすることにより、```+``` をつけなかった初めの hello パッケージの登録内容に、次の登録内容が追加されるということになります。

<details><summary>では上の処理結果を ```porg -f hello``` というコマンドにより確認してみます。</summary>
porg に登録された hello パッケージのファイル一覧を得るためには ```-f``` オプションを用いるのですが、これを実行すると確かにファイル一覧の中に ```/home/foo/usr/share/doc/hello-2.10/hello.info``` などのドキュメントが登録されていることがわかります。
</details>

```shell-session
$ porg -f hello | less
hello-2.10:
/home/foo/usr/bin/hello
/home/foo/usr/share/doc/hello-2.10/fdl.texi         # ドキュメントが登録されている
/home/foo/usr/share/doc/hello-2.10/hello.info       #   ↓
/home/foo/usr/share/doc/hello-2.10/hello.texi       #   ↓
/home/foo/usr/share/doc/hello-2.10/local.mk         #   ↓
/home/foo/usr/share/doc/hello-2.10/stamp-vti        #   ↓
/home/foo/usr/share/doc/hello-2.10/version.texi     # ここまで
/home/foo/usr/share/info/dir
/home/foo/usr/share/info/hello.info
/home/foo/usr/share/locale/bg/LC_MESSAGES/hello.mo
/home/foo/usr/share/locale/ca/LC_MESSAGES/hello.mo
...以下省略...
```

<details><summary>```+``` (プラス記号) の付け忘れには **要注意** です。```+``` があるときは追加登録です。</summary>
上述の説明の流れにおいては (```D``` オプションにだけ着目すれば)、初めに ```porg -lD make install```、次に ```porg -lD+ cp doc/* ...``` のように porg コマンドを 2 回実行しました。2 回めは ```+``` をつけた ```-lD+``` オプションです。
仮に 2 回めのコマンド実行にあたって ```+``` を付け忘れて ```porg -lD cp doc/* ...``` というコマンド実行にしてしまうと大変です。```+``` がないということは新規登録を行うことを意味するため、hello パッケージのインストールはドキュメントをコピーするという結果だけが残ることになります。
実際に ```porg -f hello``` として登録ファイル一覧を見てみればわかります。悲しいことにドキュメントファイルしか登録されていないことになります。くれぐれも ```+``` (プラス記号) の有り無しは慎重に。
</details>

### 典型的な操作(2) 登録済みパッケージの参照

#### (2a) 登録済みパッケージの確認 (特定パッケージ)

```hello``` という名前のパッケージが登録されているかどうかを確認するには、単純に ```porg hello``` とキー入力します。登録済みであれば、登録されているパッケージ名 (バージョンがある場合はそれも含めて) 出力されます。何も出力されなければ、登録されていないことを表わします。

```shell-session
$ porg hello
hello-2.10           # 登録済みであれば、登録パッケージ名が出力される

$ porg hell
(何も表示されない)     # 登録されていなければ何も表示されない (タイポではダメ)

$ porg foobar
foobar-0.0.1         # パッケージ名が同一で、
foobar-0.0.2         # バージョン違いが複数登録されている場合
foobar-1.0.1         # それらすべてが出力表示される

$ porg foobar-0      # バージョン番号部分は、一部でも探し出してくれる
foobar-0.0.1
foobar-0.0.2
```
いろいろなキー入力の仕方について、上の操作例を参考にしてください。

<details><summary>ここで登録パッケージ名は英字の大文字小文字は区別しません。</summary>
```porg hello``` でも ```porg HELLO``` でも、同じ hello パッケージを探しにいきます。
</details>
<details><summary>またパッケージ名は、完全に一致しなければ探し出してくれません。</summary>
hello パッケージを探し出すのに、その部分文字列となる ```porg hell``` としてもダメです。あるいは ```porg hel*``` のようなワイルドカード指定も対応していません。ただしバージョン番号部分になると、部分的に番号を指定するだけでも検索ヒットします。(上記操作例参照)
</details>

#### (2b) 登録済みパッケージの確認 (パッケージ全体)

登録されているパッケージすべてを知るには ```-a``` オプションを用います。アルファベット順に登録済みパッケージ名が一覧出力されます。

```shell-session
$ porg -a          # 登録済みパッケージを出力表示(アルファベット順)
acl-2.2.53
apr-1.6.3
apr-util-1.6.1
attr-2.4.48
autoconf-2.69
...以下省略...
```

<details><summary>```-a``` オプションの出力に対して、```-S``` オプションを追加すれば並べ替えができます。</summary>
```-S``` が並べ替え (sort) を行うオプションであり、どう並び替えるかを引数に与えます。引数は ```name``` (名前順; デフォルト)、```date``` (日付時刻順)、```size``` (インストール全ファイルサイズ順)、```files``` (インストールファイル数順) です。見るからに使う (使える) オプションは ```date``` だけです。

```shell-session
$ porg -a -S date  # 登録済みパッケージを出力表示(日付時刻順)
または
$ porg -aSdate     # 同上 (ショートオプションをまとめただけ)
man-pages-4.16
glibc-2.28
zlib-1.2.11
file-5.34          # ちなみにこの出力は、
readline-7.0       # 筆者が Linux From Scratch に基づき
m4-1.4.18          # porg を使って構築したシステムにおける
bc-1.07.1          # 登録パッケージ一覧です。
binutils-2.31.1
gmp-6.1.2
...以下省略...
```

<details><summary>出力表示されるものが今までの例では、登録パッケージ名だけであったのですが、これ以外に、登録日付、登録時刻、インストールサイズ、インストールファイル数も表示させることができます。</summary>
それぞれの項目を出力するためのオプションは、登録日付は ```-d```、登録日付＋登録時刻は ```-dd``` (登録時刻だけを表示する機能はありません)、インストールサイズは ```-s```、インストールファイル数は ```-F``` です。具体的には以下の操作例を参照してください。
登録日付、登録時刻くらいは必要なときがあるでしょう。ただインストールサイズやインストールファイル数は、あまり使い道が見えないのですが、唯一、一覧出力した際に、さらに全パッケージのトータルサイズを計算してくれる ```-t``` オプションがあるので、これだけは使えるかもしれません。```porg -asFt``` といった具合です。お試しください。
</details>

上の並べ替えの ```-S``` オプションとともに、登録日付 (```-d```) や時刻 (```-dd```) も表示させてみます。

```shell-session
$ porg -a -d -S date           # 登録済みパッケージと登録日付を出力表示(日付時刻順)
または
$ porg -adSdate                # 同上 (ショートオプションをまとめただけ)
08/22/18  man-pages-4.16
08/22/18  glibc-2.28
08/22/18  zlib-1.2.11
...以下省略...

$ porg -a -dd -S date          # 登録済みパッケージと登録日付時刻を出力表示(日付時刻順)
または
$ porg -addSdate               # 同上 (ショートオプションをまとめただけ)
08/22/18 11:10  man-pages-4.16
08/22/18 11:31  glibc-2.28
08/22/18 11:32  zlib-1.2.11
...以下省略...
```
#### (2c) 登録済みパッケージのファイル一覧
前記事においてすでにしめしたように、特定の登録済みパッケージに対して、登録されている (インストールされている) ファイルの一覧を確認するには ```-f``` オプションを用います。

```shell-session
$ porg -f hello | less
hello-2.10:
/home/foo/usr/bin/hello
/home/foo/usr/share/info/dir
/home/foo/usr/share/info/hello.info
/home/foo/usr/share/locale/bg/LC_MESSAGES/hello.mo
/home/foo/usr/share/locale/ca/LC_MESSAGES/hello.mo
...以下省略...
```


### 典型的な操作(3) 登録済みパッケージの削除

登録済みパッケージを削除するには ```-r``` オプションを用います。これは porg への登録内容を削除するのはもちろん、そのパッケージのインストール内容もすべて削除します。

```shell-session
$ porg -r hello
The following packages will be removed:
    hello-2.10
Do you want to proceed (y/N) ?             # プロンプトに対し 'y' を入力
```

もし指定したパッケージ名に該当するものが複数あった場合 (バージョン違いが複数あった場合) は、そのすべてが削除対象となり、プロンプトに ```y``` (yes) を入力すれば、一気にすべてが削除されます。

```shell-session
$ porg -r foobar
The following packages will be removed:
    foobar-0.0.1
    foobar-0.0.2
Do you want to proceed (y/N) ?             # プロンプトに対し 'y' を入力
                                           # foobar-0.0.1, 0.0.2 が両方削除される
```

上で複数バージョンすべてを削除するつもりがなく、特定バージョンだけ削除するのであれば、バージョン番号まで指定して削除します。

```shell-session
$ porg -r foobar-0.0.1
The following packages will be removed:
    foobar-0.0.1
Do you want to proceed (y/N) ?             # プロンプトに対し 'y' を入力
```

以上です。