Cygwinで、jekylljekyll-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で動かす道を選びました。ご覧の通り、それはそれで結局茨の道だったわけですけどね。


スポンサード リンク

この記事のカテゴリ

  • ⇒ Cygwinでjekyllとjekyll-pressを使う(ExecJSをCygwinでとりあえず動かす)
  • ⇒ Cygwinでjekyllとjekyll-pressを使う(ExecJSをCygwinでとりあえず動かす)