メモです。
元はServerless Frameworkでserverless-appsync-simulatorとserverless-offlineを使おうと思ったら Error: spawn watchman ENOENT
っていうエラーが出て起動できず、ぐぐったらwatchman
をインストールすればいいってことでその対応。
MacならHomebrewであっさりインストールできるのだが、あいにく自分はVS Code + Remote Containersである。コンテナとしては公式のNode.jsのイメージを使っていてこれはUbuntuベース。
というわけでLinuxにwatchmanをインストールしようとしたらそこそこハマったのでそのメモ。
まず、Linuxにwatchmanを入れるにはソースからコンパイルして入れる必要がある。一応バイナリも配布されているらしいが。
ソースからコンパイルしてインストールするにあたり事前に以下のパッケージをインストールしておく必要がある。
apt install -y make libtool libssl-dev autoconf automake pkg-config g++ libpython-dev
最後のlibpython-dev
ってのは今回自分が使っているようにPythonがインストールされていないイメージではpyconfig.h
が存在せずビルドに失敗するから。
これらを入れたら以下のようにGitからソース持ってきて入れる。
git clone https://github.com/facebook/watchman.git -b v2022.07.18.00 --depth 1 cd watchman ./autogen.sh
なお、公式のインストール手順だとGitからクローンするバージョンがv2021.09.20.00
と古い。そうするとpcre
のダウンロードに失敗するので新しいものを使う。そして公式手順では./autogen.sh
の次に./configure
してmake install
するというおなじみの手順があるのだが、新しいものを使うと./configure
が生成されずmake install
もできない。というわけで以下のようにやっていく。
まず、そのままだと./autogen.sh
にも失敗する。どうやら新しいやつだとRustも必要だったのでインストールする。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env
Rustをインストールした後に./autogen.sh
を実行する。
前述の通り、masterの最新でビルドした場合はconfigure
が生成されず、make install
もできない。そのためこのあたりを手動でセットアップする必要がある。まず、ビルドされた成果物はbuild/bin
フォルダにあるのでこのディレクトリに対してPATHを通すか、すでにPATHが通っているどこかのディレクトリに中身をコピーする。自分の場合はひとまずすでにPATHが通っている/usr/local/bin
にコピーした。
そしてwatchman
を実行してみるとこんなエラーが出る。
./built/bin/watchman: error while loading shared libraries: /usr/local/lib/libgflags.so.2.2: cannot open shared object file: No such file or directory
これはビルドされた共有ライブラリをちゃんと参照できていないということ。これらはbuild/lib
以下にあるのでこれを/usr/local/lib
にコピーした上で環境変数LD_LIBRARY_PATH
をセットした。
cp -p ./built/lib/lib* export LD_LIBRARY_PATH=/usr/local/lib/
そして実行してみると今度は次のエラーである。
[watchman] while computing sockname: failed to create /usr/local/var/run/watchman/root-state: No such file or directory
これは単にディレクトリがないだけなので作成する。
mkdir -p /usr/local/var/run/watchman
ここまでやってようやく起動に成功する。ちなみにautogen.shの実行は結構時間がかかる。コンテナのなかで実行してるからかもしれないが。自分の環境だと10分以上は平気でかかった。
本来の目的であったsls offline start
も問題なく実行できた。めでたし。
あとはこれをDockerfileに起こすだけ。