blog.bouzuya.net

2017-02-11 PureScript IDE が psc-ide-server の起動に失敗するのを解決した

bouzuya/rally-cli の import があとすこしでできそうなのだけど、今日はそれではなく Visual Studio Code の PureScript IDE が psc-ide-server の起動に失敗する問題を解決したことを書く。

結論から書く。 PATH に Node.js が含まれておらず、 psc-ide-server の実行が失敗することが原因だった。 Terminal から Visual Studio Code を起動した場合は bash / zsh の設定ファイルで PATH に設定されるので問題ないのだけど、 Spotlight から Visual Studio Code を起動した場合は PATH に設定されないため問題が起きる。解決策としては /etc/profile に PATH の設定を含めるなどがある。

たどった経路を書いておく。

もちろん、ここまで直線的ではなく、あちらこちらへいろいろな原因を疑いながら移動した。

findBins'getVersionpsc-ide-server --version 相当を実行し、Executable を返す。Executabledata Executable = Executable String (Maybe String)Stringpsc-ide-server のパスで、 Maybe Stringpsc-ide-server のバージョンだ。 getVersion に失敗した場合は Nothing が入る。

今回の状況では Node.js が見つからないため getVersion によって実行される psc-ide-server コマンドが失敗する。それが Executable "/path/to/psc-ide-server" Nothing という Maybe StringNothing にした形で伝えられる。ちなみに正常なら Executable "/path/to/psc-ide-server" (Just "0.10.6") などという形で返される。「 Nothing のとき Executable じゃなくね?」と個人的には思うのだけど、そういう仕様なのだから仕方ない。

それを P.startServer' 内で処理するのだけど、ユーザーの目に触れない位置での log だけでバージョンの ERROR を通知するのみで、 実際の実行では強引に実行しようとしている。https://github.com/nwolverson/purescript-ide-purescript-core/blob/v0.8.2/src/IdePurescript/PscIdeServer.purs#L89-L110

startServer' の結果は StartError になるのだけど、画面に表示されるエラーメッセージは「ポート番号を確認しろ」というものとなる。ポート番号に問題はない。 https://github.com/nwolverson/purescript-ide-purescript-core/blob/v0.8.2/src/IdePurescript/PscIdeServer.purs#L110

P.startServer' がバージョンの確認に失敗する状況を甘く見ている。 Visual Studio Code における PATH は Terminal のものとも異なるので、画面表示のメッセージが弱いと、原因に気づきにくい。