MacPortsでrsyncが使えない場合の代替手段

# はじめに

[MacPorts](https://www.macports.org/)は、macOSおよびDarwin OS上のソフトウェア導入を単純化するためのパッケージ管理システムの一つで、もともとはBSDなどの機能と同様のものを目指して開発されたものです。MacPortsは指定されたパッケージ名のバイナリが存在する場合はそれをダウンロードし、ない場合はダウンロードとインストールを行う。依存関係のあるパッケージも自動的にインストールしてくれるし、アップデートなどにも対応している。

同様の機能を持つものとしてはHomebrewが挙げられるが、Homebrewが「極力インストール済みのバイナリを使って依存関係を解消した構成」を作ろうとするのに対して、MacPortsは「MacPortsでインストールしたソフトウェアで依存関係を解消した構成」を取ろうとするため、どうしても容量を食いがちである。そのため、昨今の技術記事などを見ると「Homebrewを使って…」という文言が目立つものの、MacPortsもまったくもって現役なプロジェクトである。

# なぜrsyncを考えるのか

MacPortsはパッケージリストの更新（`sync`）や自分自身のアップデート（`selfupdate`）で `rsync` を用いる。ここに落とし穴があるのだが、昨今様々な場所、例えば大学に属していたり、あるいはイベント会場で自分のものではないNWにアクセスする際を考える。不特定多数、あるいは大学や会社など限られたメンバーしかアクセスできないような環境であっても、セキュリティ上の理由によって使用できる通信が制限されているケースがある。Webブラウジングのために`http`あるいは`https`は許可されていても、`ssh`を始め、各種通信に利用するポートが閉じているケースである。この際、`rsync`も制限を受けることがある。

こういった環境下では、MacPortsが新しいパッケージリストを取得したり、あるいはアップデートができない[^1]。それに対し、MacPortsは`https`越しにGitを使えるようになった。ここでは、その設定方法について紹介する。

[^1]: MacPorts自身のアップデートで言えば、最近のMacであればMacPortsのインストーラを用意して上書きアップデートすることは可能だが、結局パッケージリストはある断面の古いままである。


# Gitの設定とSync

設定方法は[How to sync your ports tree using Git over HTTPS](https://trac.macports.org/wiki/howto/SyncingWithGit)に記載されている。ここにもProxyによってrsyncがブロックされている人に向けていると明記されている。

> Some people live and work behind a firewall or proxy that blocks or otherwise breaks rsync, which is the primary means of getting updated Portfiles in MacPorts. The following steps will switch your tree over to using Git over HTTPS for syncing.
>
>Note: if you are using a custom prefix, you will have to replace the default of /opt/local with the location of your MacPorts install in the instructions below.

## Gitのインストール（入っていない場合）

MacPorts自身を利用して、Gitをインストールする。インストールする際は`rsync`を使わないので、NW的にブロックされない。

```text
$ git --version # gitがインストールされているかのチェック
```

入っていなければ、以下のコマンドを叩く。

```text
$ sudo port -v install git
```

## GitのリポジトリをClone

`/opt`以下に必要なものを用意する。

```text
$ cd /opt/local/var/macports/sources
$ sudo mkdir -p github.com/macports/macports-ports/
$ sudo chown -R $USER:admin github.com
$ git clone https://github.com/macports/macports-ports.git github.com/macports/macports-ports/
```

## 設定ファイルの編集

以下のように、`/opt/local/etc/macports/sources.conf`の`rsync://`で記載されている行をコメントアウトし、`file:///`で始まる行を追加する。

```conf:sources.conf
#rsync://rsync.macports.org/macports/release/tarballs/ports.tar [default]
file:///opt/local/var/macports/sources/github.com/macports/macports-ports/ [default]
```

## パッケージリストの更新

`sync`をかける。なお、初回実行時はかなりの量の更新があるので、`-v`や`-d`のオプションを付けて進行状況を見えるようにしておくことをお勧めする。

```text
$ sudo port -v sync
```

# selfupdate

MacPortsの`selfupdate`を単体で行おうとすると、どうしても`rsync`を使う必要があり、アップデートができない。かといって古いバージョンのMacPortsを使い続けて良いかというと、新しいパッケージがリストになくてwarningやエラーが出てくるので、オススメできない。この場合、`svn`を利用してアップデートする方法もあるそうだが、最近のMacPortsであれば、インストーラをダウンロードして上書きインストールすれば良い。少なくとも、macOS MojaveでMacPorts2.6.1から2.6.2へのアップデートはこの方法でうまくいき、安定して使えている。

# まとめ

MacPortsに限らず、広く世の中で使われているソフトで問題に直面した場合、誰かしらがいずれかの方法で解決し、それが公式の手法として提供されていることも少なくない。ダーティハック的に対処していく方法もなくはないが、極力先人たちの知恵に従ったほうが安心安全である。


# 参考

* [How to sync your ports tree using Git over HTTPS](https://trac.macports.org/wiki/howto/SyncingWithGit)
* [芝浦工業大学/冨田研究室](http://www.comphys.las.shibaura-it.ac.jp/SettingMacPortsBehindProxy)