Cygwinで、jekyllにjekyll-press(あるいはExecJSを使用する何か)を組み合わせて使おうとすると、ExecJSがエラー吐いて動きませんでした。とりあえずの回避策を見つけたというお話です。
ハングアップの日々 (2012/06)を参考に、CygwinのRuby上でjekyllを入れたところまでは良かったのですが、jekyll-pressを入れた途端bundle exec jekyll serve –watchその他がダメになりました。こんな感じの行で始まるバックトレースが出力されます。
/……/vendor/bundle/ruby/1.9.1/gems/execjs-1.4.0/lib/execjs/external_runtime.rb:173:in `read': "\x82\xDC" on UTF-16LE (Encoding::InvalidByteSequenceError)
ExecJSがJScriptの出力をUTF-16 (cscript //U)で受け取ろうとしているのですが、どうやらCygwinではこれがうまくいっていないようでした。
そこで、//Uオプションを使わないようにしたらよいと考え、ExecJSのソースコードを直接書き換えることから始め、最終的にこのようなスクリプトになりました。bundle exec jekyll serve –watchの代替になるもののつもりです。
require 'rubygems' gem 'jekyll' gem 'execjs' require 'jekyll' require 'execjs/module' require 'execjs/external_runtime' module ExecJS module Runtimes JScriptCP932 = ExecJS::ExternalRuntime.new( name: 'JScriptCP932', command: 'cscript //E:jscript //Nologo', runner_path: ExecJS.root + '/support/jscript_runner.js', encoding: 'CP932') end end ENV['EXECJS_RUNTIME'] = 'JScriptCP932' require 'execjs' options = Jekyll.configuration({}) Jekyll::Commands::Build.process(options) Jekyll::Commands::Serve.process(options) |
まともに直すとしたら、パイプでやりとりする部分をASCIIのみで済むように手当てするか、JScript.dllをインプロセスで動かすなどといったところでしょうか。
なお、WindowsでJekyllを使いたいというのであれば、Windowsでjekyllを使えるようにするよ ― KaoriYaのほうが楽かもしれません。私は、手元でパッチ当てるのとBundlerとの両立の方法を知らず、調べるのも面倒だったので、Cygwinで動かす道を選びました。ご覧の通り、それはそれで結局茨の道だったわけですけどね。
スポンサード リンク |
この記事のカテゴリ
- JavaScript ⇒ Cygwinでjekyllとjekyll-pressを使う(ExecJSをCygwinでとりあえず動かす)
- Ruby ⇒ Cygwinでjekyllとjekyll-pressを使う(ExecJSをCygwinでとりあえず動かす)