この記事はOpal Advent Calendar 2016の16日目の投稿として書いています。
昨日の続きで、electron_opalをOpal v0.10.3で動かしてみましょう。
まずは、Opalのバージョンをそのまま上げて動くでしょうか?
cloneしてきたソースコードのelectron_opal.gemspecをOpalのバージョンを変更します。
s.add_dependency "opal", "~> 0.10.0"
bundleコマンドでアップデートします。
$ bundle update
opalのバージョンが0.10.3になりました。
ビルドしてみましょう。
$ bundle exec rake build
rake aborted!
can't modify frozen Array
いきなり失敗しました。Opal.pathes
がfrozenに変更になったのでしょう。
21行目を
@config.paths = Array.new(Opal.paths)
と書きかえます。
つぎは、load_asset_code
というメソッドがないと言われます。
14日目の記事の書いたとおり、Opal::Builder.build
を使います。
Opal::Builder.build
でコンパイルされたコードはロードするとそのまま実行されますが、
元のコードではOpal::Processor.load_asset_code
とenv.find_asset
に分かれていて、コンパイルされたコードとそれを呼び出すコードとに分けています。
67行目のcompile_js
は次のように書きかえます。
def compile_js(asset_name, options={})
load_asset_code = Opal::Builder.build(asset_name)
write_to("#{asset_name}.js", load_asset_code)
end
106行目は削除しましょう。
scripts << %{<script>#{Opal::Processor.load_asset_code(@env, @name)}</script>}
これだけでは、buildするとファイルがみつからないと言われます。
33行目、setup_env
を以下のように書きかえます。
def setup_env
config.paths.flatten.each { |p| Opal.append_path(p) }
end
51行目はPathnameのままだとだめみたいなので、to_s
を呼んでStringにしておきます。
asset_name = Pathname.new(file_path).basename(".rb").to_s
$ bundle exec rake build
$ bundle exec rake
ちゃんと動きましたでしょうか?
これで一応、OpalでElectronアプリが動きました。
今回の修正はelectron_opalにPRしようかと思ったのですが、大分メンテナンスされていないようだし、実はElectronのライブラリのラッパーも持っているのですが、わたしが書いたようなNative
を使う方法ではなく独自のやりかたをしています。
electron_opalをメンテナンスしていくよりは、別に新しいものを作ったほうがよさそうだと思ったのでPRはしませんでした。
ある程度まとまったものが出来たら、また発表しようと思います。