Ruby
Opal
Electron
OpalDay 16

OpalでElectronのアプリをつくる(その3)

More than 1 year has passed since last update.

この記事はOpal Advent Calendar 2016の16日目の投稿として書いています。

昨日の続きで、electron_opalをOpal v0.10.3で動かしてみましょう。

まずは、Opalのバージョンをそのまま上げて動くでしょうか?
cloneしてきたソースコードのelectron_opal.gemspecをOpalのバージョンを変更します。

electron_opal.gemspec
  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行目を

lib/electron_opal.rb
  @config.paths = Array.new(Opal.paths)

と書きかえます。

つぎは、load_asset_codeというメソッドがないと言われます。

14日目の記事の書いたとおり、Opal::Builder.buildを使います。
Opal::Builder.buildでコンパイルされたコードはロードするとそのまま実行されますが、
元のコードではOpal::Processor.load_asset_codeenv.find_assetに分かれていて、コンパイルされたコードとそれを呼び出すコードとに分けています。

67行目のcompile_jsは次のように書きかえます。

lib/electron_opal#L67
def compile_js(asset_name, options={})
  load_asset_code = Opal::Builder.build(asset_name)
  write_to("#{asset_name}.js", load_asset_code)
end

106行目は削除しましょう。

lib/electron_opal#L106
      scripts << %{<script>#{Opal::Processor.load_asset_code(@env, @name)}</script>}

これだけでは、buildするとファイルがみつからないと言われます。
33行目、setup_envを以下のように書きかえます。

electron_opal#L33
def setup_env
  config.paths.flatten.each { |p| Opal.append_path(p) }
end

51行目はPathnameのままだとだめみたいなので、to_sを呼んでStringにしておきます。

electron_opal#L51
    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はしませんでした。
ある程度まとまったものが出来たら、また発表しようと思います。