Electron と Ruby でネイティブアプリを作る方法 – 1 標準出力随時受け取り

概要

こんにちは。アレクスです。
今回はですね。 Node.jsからrbファイルを実行して、
標準出力を受け取ることについて解説します。

長いこと中途半端に取り組み見て見ぬふりしていました問題が、
以外にもサクッ🍘と解決してしまいなんだか😦だったのですが、
落とし穴なポイントが有りましたので、公開いたします。

今回は超初期段階です、これから複雑な実装を行いますので、
また投稿したいと思います。

最終目的

Rubyで作ったプログラムをElectronから実行して、標準出力を受け取って、
画面に表示させたいですね。プログレスバーに反映できれば great!ですね。

イメージ
Rubyで進行状況のパーセンテージ計算 => 数値をstdout
Node.jsで受け取り => GUIのプログレスバーデザイン部分のwidthに随時反映

初期段階

まずは Node.js から外部コマンドで、簡単な Ruby コードを実行してみます。
エラーもどうなるか合わせてみてみます。



# coding: utf-8
Encoding.default_external = 'UTF-8'

begin

  5.times {
    print "HELLO WORLD!"
    sleep(0.5)
  }

  raise "ERROR"

rescue => ex
  print ex.class
  print ex.message
  print ex.backtrace
end


Node.js は以下のようにspawnを使います。


const spawn = require('child_process').spawn;
const ls = spawn('ruby', ['hello.rb']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});


参考:Child Process Node.js v5.5.0 Manual & Documentation

でもはじめは実行してもうまく行かなかったんですよね😿

原因

原因は2つありました。

– Ruby側のstdoutp出ないとダメ
putsでもprintでも実験したらダメでした。
– ちゃんとターミナルでしてなかったのでダメ
Sublime Text3のビルドツールでやってました。

p以外でやった場合は、随時ではなく全て終わってから帰ってきますね。
SublimeText3のビルドツールでrunすると以下のエラーが出ました。


events.js:154
      throw er; // Unhandled 'error' event
      ^

Error: spawn ruby ENOENT
    at exports._errnoException (util.js:856:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32)
    at onErrorNT (internal/child_process.js:344:16)
    at nextTickCallbackWith2Args (node.js:474:9)
    at process._tickCallback (node.js:388:17)
    at Function.Module.runMain (module.js:449:11)
    at startup (node.js:139:18)
    at node.js:999:3

以上、簡単ではございましたがご紹介でした。

投稿者:

Alex.js

プログラマーのアレックスです。 日本人の母と、アメリカ人の父の間に生まれました。 出身は、ITの聖地シリコンバレーのあるサンタクララです。 Hi. I'm Alex.J.Smith. It's Japanease American born in Santa Clara CA.

「Electron と Ruby でネイティブアプリを作る方法 – 1 標準出力随時受け取り」への2件のフィードバック

  1. > – Ruby側のstdoutはp出ないとダメ
    > putsでもprintでも実験したらダメでした。

    $stdoutがバッファリングされているからかもしれませんね。

    $stdout.sync = true

    をしておけばputs, printでも大丈夫かもしれません。

    1. そうですね。
      Qiitaにてアドバイスを頂きましたので、
      現在はその方法でやらせていただいています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です