Homebrew のインストール先を変えた環境でwatchman 実行時にエラーになったら対応すること

## はじめに
プロジェクトのパッケージ管理の都合上、Homebrew のインストール先をデフォルトから変更しなければならない場合があります。
 
ほとんどのライブラリについては、`brew install`をする際に必要なパスや環境変数を変更してくれるのでインストール先を変更しても問題はないのですが、```Watchman```は実行時にエラーが出てしまうことがあります。

本記事では僕が詰まった時にエラーを解決した方法についてまとめます。
自分はそこそこな時間解決までにかかったので、同じような原因で詰まってしまう方の助けになれば幸いです。
 
## 発生したエラー
Watchmanを内部的に利用するライブラリ(自分の場合は[serverless-appsync-plugin](https://github.com/sid88in/serverless-appsync-plugin)でした)の開発環境の起動時に下記のようなエラーが発生しました。

```
Error: watchman --no-pretty get-sockname returned with exit code=1, 
signal=null, stderr= 2021-06-29T11:41:08,049: [] 
while computing sockname: failed to create /usr/local/var/run/watchman/some-user-state:
 No such file or directory
  
      at ChildProcess.<anonymous> (/Users/some-user/some-project/node_modules/fb-watchman/index.js:198:18)
      at ChildProcess.emit (events.js:314:20)
      at ChildProcess.EventEmitter.emit (domain.js:483:12)
      at maybeClose (internal/child_process.js:1022:16)
      at Socket.<anonymous> (internal/child_process.js:444:11)
      at Socket.emit (events.js:314:20)
      at Socket.EventEmitter.emit (domain.js:483:12)
      at Pipe.<anonymous> (net.js:675:12)
```

## 解決方法
ディレクトリが作成できないとエラーが出ているので、下記のコマンドでディレクトリを作成しました。

```sh
# 必要なディレクトリを作成する
sudo mkdir -p /usr/local/var/run/watchman/some-user-state

# そのままだとホスト権限がないと作成したディレクトリにアクセスできないので、権限を渡す
sudo chown -R some-user /usr/local/var/run/watchman
```

logファイルだけ```/usr/local```以下に作成されてしまい、少し気持ち悪いのですが実行時のエラーはこちらの方法で解決できました。

## 原因
公式ページにも記載のあるように Watchman は実行時のログを```<PREFIX>/var/run/watchman/<USER>-state/log```のディレクトリに保存します。

また、この ```<PREFIX>```の部分はデフォルトでは```/usr/local```に設定されています。

>Watchman places the logs in a file named <STATEDIR>/log, which will typically be a location like <PREFIX>/var/run/watchman/<USER>-state/log. If you’re running a homebrew build of watchman, <PREFIX> is usually /usr/local.

https://facebook.github.io/watchman/docs/troubleshooting.html#where-are-the-logs
 

Homebrewのデフォルトのインストール先も```/usr/local```なので、デフォルトでインストールした場合は問題になりませんが、Homebrew のインストール先を変更していた場合は、WatchmanのバイナリはHomebrewで管理されたフォルダにありますが、logはroot権限が必要な```/usr/local```以下に作成されるため、インストール時に必要なディレクトリが作成されず実行時に必要なディレクトリがないとエラーになります。
 
WatchmanをHomebrewでインストールする際には、下記のようなコードでlogの保存先のディレクトリが作成されています。

```watchman.rb
  def post_install
    (var/"run/watchman").mkpath
    chmod 042777, var/"run/watchman"
  end
```

参考:
[HomebrewのFormula(Watchman)](https://github.com/Homebrew/homebrew-core/blob/master/Formula/watchman.rb#L48)

## その他Watchmanについて調べたことこと

### 1. PREFIXという環境変数を設定してみる
```watchman/blob/master/autogen.sh```のコードをみたところPREFIXという環境変数でなんとか変更できないかと思ったのですが、設定して実行 / 再インストールを試みてもうまく動作しませんでした。

参考: [watchman/blob/master/autogen.sh](https://github.com/facebook/watchman/blob/master/autogen.sh)

### 2. ```--enable-statedir オプションで実行する```
Watchmanの公式ページでは--enable-statedirオプションで```STATEDIR```を変更できるよとあったのですが、ライブラリ経由でWatchmanを呼び出しており、ライブラリ側ではこちらのオプションを設定できそうになかったので実現できませんでした。


参考: [Wachman > Command Line > quick-note-on-default-locations](https://facebook.github.io/watchman/docs/cli-options.html#quick-note-on-default-locations)


## 参考
* [Wachman > Troubleshooting > Where are the logs?](https://facebook.github.io/watchman/docs/troubleshooting.html#where-are-the-logs)
* [Wachman > Command Line > quick-note-on-default-locations](https://facebook.github.io/watchman/docs/cli-options.html#quick-note-on-default-locations)
* [HomebrewのFormula(Watchman)](https://github.com/Homebrew/homebrew-core/blob/master/Formula/watchman.rb#L48)
* [Homebrew のインストール先を変更する](https://qiita.com/usamik26/items/601f5612bd3f8a21cc41)
* [homebrewでwatchmanインストールするときの制限](https://qiita.com/sakymark/items/8683ec23e4ae5560d612)