Posted at
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はしませんでした。

ある程度まとまったものが出来たら、また発表しようと思います。