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

  • 0
    Like
  • 0
    Comment

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

    This post is the No.16 article of Opal Advent Calendar 2016