Help us understand the problem. What is going on with this article?

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away