Flow最新版をWindowsで動かしてみた

# 注意
この記事は 2016/06/29 時点の内容です。FlowのWindows対応は現在進行中のため、ここに書いてあることはすぐに陳腐化する恐れがあります。

# はじめに
2016/06/29時点では[Flow (v0.27.0) はWindows環境に正式対応していない](https://github.com/facebook/flow/tree/v0.27.0#requirements)。

>Requirements
>
>Flow works with:
>
>Mac OS X
>Linux (64-bit)

そこで、どうしてもWindows環境で[Flow](http://flowtype.org/)を使いたい場合は、[OCamlPro teamによるビルド版](http://www.ocamlpro.com/pub/ocpwin/flow-builds/)を使うという方法があった。過去にQiitaの記事このOCamlPro team版が紹介されていた。

* [flowをWindowsでつかってみる　＋gulpで監視](http://qiita.com/YutamaKotaro/items/e63f69cd0338f9e4f32f)
* [Windows で Flow を触ってみる](http://qiita.com/wakuworks/items/61084eded74e47d2143e)

しかしながら、OCamlPro team版は2015年12月以降は更新が止まっており、バージョンが0.19.1と古いままとなっていた。

そんな時、Flowの[Windows対応のIssue](https://github.com/facebook/flow/issues/6)をsubscribeしていると、二日前に [最新版をWindowsでビルドできるようになったよ](https://github.com/facebook/flow/issues/6#issuecomment-228688828) というコメントが投稿されたことに気づいた。

> oviava commented 2 days ago
> 
> You can build the latest version directly with OCAML win:
> https://gist.github.com/oviava/9c7f0a5ec2fdcdc737b0a75239e6546f

このコメントを投稿したoviava氏は上記GistでWindowsでの動かし方について書いてくれている。
というわけで自分もこれを参考にして動かしてみた。


# 事前準備

## OCPWinのインストール
FlowのビルドにOCamlが必要なので、Windows版バイナリのOCPWinを[こちらから入手して](https://www.typerex.org/ocpwin.html)インストールしておく。
なお、[oviava氏のGist](https://gist.github.com/oviava/9c7f0a5ec2fdcdc737b0a75239e6546f)では `ocpwin64-20160113-4.01.0+ocp1-full-mingw64.exe` が使われていたが、自分は少し新しい `ocpwin64-20160113-4.02.1+ocp1-full-mingw64.exe` で試してみている。

## ansiconのインストール
コマンドラインでflowを実行すると、ANSIエスケープシーケンスで色付けされるのだがWindows7のコマンドプロンプトやGit Bashだとこれが認識されず、制御文字丸見えで非常に読みづらい。
Windows7だと [ansicon](https://github.com/adoxa/ansicon) をインストールすればこれは解決できるので、入れておいた。

※試していないがWindows10だとANSIエスケープシーケンスのサポートがされたようなのでansiconは不要と思われる。

# Flowのビルド
Flowをソースよりビルドする。まずはGitHubよりソースを取得する。

```bash:GitHubよりgit&nbsp;clone
git clone https://github.com/facebook/flow
```

後は、ビルドスクリプトとして `make.bat`があるためこれを叩くだけと簡単。Windowsのコマンドプロンプトを開き実行すればよい。ただし、masterブランチの状態によってはビルドが失敗するケースがあるの注意。
例えば 2016/06/29時点で最新の`commit 120140baef42941b786dfa1e0cb2953b32a6882c`ならビルドできたが、1つ前の `commit 92ee96f32c3e327e7bae0e5aae60f8f0050e859c` ではビルドが壊れてしまっているので注意。

```bat:ビルド実行
c:\Users\wadahiro\src\github.com\facebook\flow>make.bat

c:\Users\wadahiro\src\github.com\facebook\flow>REM No echo arguments will be printed in the current state
find_project_root
...
0.06s flow\flow.cmo                                                    [ done ]
0.16s flow\flow.cmx                                                    [ done ]
0.98s flow\flow.byte.exe                                               [ done ]
1.84s flow\flow.asm.exe                                                [ done ]
Build Successful in 83.26s. 761 jobs (parallelism 0.8x), 1265 files generated.
ocp-build: Leaving directory `c:\\Users\wadahiro\src\github.com\facebook\flow'
        1 個のファイルをコピーしました。
```

後はビルドされた`flow.exe`をPATHが通っている`c:\Users\<my_user>\AppData\Roaming\npm\`にコピーしておく。

```bat:flow.exeのコピー
c:\Users\wadahiro\src\github.com\facebook\flow>copy bin\flow.exe c:\Users\<my_user>\AppData\Roaming\npm
        1 個のファイルをコピーしました。
```

# 使ってみる

```bash
$ flow init
$ flow check
Found 0 errors
```

エラーケースを試す。下記内容の`index.js`を作成し、

```js:index.js
// @flow

function foo(n) {
  return n * 2;
}

foo('bar');
```

`flow check`すると、ちゃんと動いていますね！

```bash
$ flow check
index.js:7
  7: foo('bar');
     ^^^^^^^^^^ function call
  4:   return n * 2;
              ^ string. This type is incompatible with
  4:   return n * 2;
              ^^^^^ number


Found 1 error
```

# Nuclideでも試してみた

[oviava氏のGist](https://gist.github.com/oviava/9c7f0a5ec2fdcdc737b0a75239e6546f)では、Windows環境の[Nuclide](https://nuclide.io/)上でFlowチェックを走らせる方法も書いてくれている。

Gistによると、`c:\Users\<my_user>\.atom\packages\nuclide\pkg\nuclide-flow-base\lib\FlowHelpers.js` の修正が必要と書かれているが、実はoviava氏がNuclideに[本問題のPull Requestを出しており既にマージさている](https://github.com/facebook/nuclide/pull/564)。なので、最新版(v0.148.0)のNuclideを使えばこの問題は発生せず、修正は特に不要である。

コマンドラインでチェックした`index.js`をNuclideで開くと、下記のようにこちらも無事に動作することを確認した。

![nuclide_flow.png](https://qiita-image-store.s3.amazonaws.com/0/35233/1142d81c-ef75-6807-232e-76249d29cc85.png)


# まとめ
ずっと放置されていたみたいだが、ようやくFlowもオフィシャルにWindows対応してくれそうな動きになってきました。ただし、[Windows対応のIssue](https://github.com/facebook/flow/issues/6)でFlow開発者のgabelevi氏が下記のようにコメントしており、まだ使用はおすすめはしないとのことなので、実プロダクトへの適用はもうちょっと待ったほうがよさそうです。

> @oviava - yep, as you've noticed Windows support is getting closer! It builds and mostly works, but I wouldn't recommend it quite yet.