銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

Gitbookのライブ・リロードがWindowsで異常終了する問題を(とりあえず)回避する

f:id:takamints:20190201191029j:plain
photo credit: tgrauros Helsingin yliopiston kirjasto / Biblioteca de la Universitat de Hèlsinki via photopin (license)

プランナー一年生のためのゲーム仕様書の書き方
株式会社サクセス (2017-01-15)
売り上げランキング: 2,254

マークダウンで複数ページからなるドキュメントを綺麗に書けるGitbookですけれど、仕事では先日初めて使うことになりまして「Windowsではライブ・リロードが正しく動かない」ってことを思い出しましたので、とりあえずの回避方法をさらっと書いておきます。

目次

Gitbook?

GitbookはMarkdownで書いた文書を電子文書的にキレイにまとめてくれるツールです。

章立てされた一連の文書を相互にリンクを貼って並べてくれるので便利です。

Markdownを書いて、gitbook build でHTMLを出力します。

また、gitbook serve で、ローカルWEBサーバーを起動するので、ブラウザで出力された文書を確認できます( http://localhost:4000/ )。

Gitbookのライブ・リロード?

Gitbookのライブ・リロード(live reload)は、出力したドキュメントを gitbook serve で確認している時、ソースファイル(Markdown)の更新を監視し、自動的にビルドし、ページをリロードしてくれる標準のプラグインです。

Windowsでは上手く動かない

めっちゃ便利な機能ですけど、残念ながらWindowsでは正しく動いてくれません。 ソースファイルを更新するとローカルWEBサーバーが異常終了してしまうのです。

PS C:\Users\Takami\rd\gitbook-on-win> gitbook serve
Live reload server started on port: 35729
Press CTRL+C to quit ...

info: 8 plugins are installed
info: 7 explicitly listed
info: loading plugin "livereload"... OK
(中略)
info: loading plugin "theme-default"... OK
info: found 1 pages
info: found 3 asset files
info: >> generation finished with success in 1.0s !

Starting server ...
Serving book on http://localhost:4000 #このあとソースファイルを再保存すると・・・
Restart after change in file README.md

Stopping server #停止した
events.js:167
      throw er; // Unhandled 'error' event
      ^

Error: EPERM: operation not permitted, watch
    at FSEvent.FSWatcher._handle.onchange (internal/fs/watchers.js:123:28)
Emitted 'error' event at:
    at FSWatcher._handleError (C:\Users\Takami\.gitbook\versions\3.2.3\node_modules\chokidar\index.js:236:10)
    (中略)
    at FSReqWrap.oncomplete (fs.js:141:20)

とりあえずの回避方法

この挙動、GitHubでIssueが上がっていますが完全放置状態。しかしIssueのコメントにとりあえずの対処法が書かれていました。

git serve でWEBサーバーが起動したあと、出力フォルダ(デフォルトで _book)を一度消せば、その後正常動作する」というものです。

実際にやってみると確かに解決。 _bookディレクトリは、消した直後にビルドされてすぐに復活。 ファイルを何度更新しても自動ビルドが正しく行われ、元気に動き続けてました。

しかし、この操作もちょっと面倒。 コンソールから gitbook serveした後は、同じコンソールが使えませんから別コンソールを起動して(またはエクスプローラでフォルダを開いて)_bookを消すことになりますからね。

そこで作業開始時にコンソールでgitbook serveしておいて、別コンソールを立ち上げて rm -r _book。そのままファイルを編集しはじめれば、それほど手間には感じません。

npm scripts でチョットだけ楽をする

ちなみにワタシは npm scriptsからgitbookを叩いていますので、以下のように設定しています。

  ・・・
  "scripts": {
    "serve": "gitbook serve",
    "open": "rm -rf _book && opn http://localhost:4000",
  },
  ・・・

npm run serve の後、別コンソールで、npm run open としてページを開きます。 (※ npm内の opnコマンドは npm install --save-dev opn-cli で使用できるようにしています)

gitbook serve --openでWEBサーバー起動後にドキュメントを開けますが、これをするとファイルを更新する度にタブが追加されて最新ページが表示されてタブだらけになるのです。

リンク

github.com

toolchain.gitbook.com