hotch-potch, Note to self

いろいろ作業記録

Elixir CircuitsをCLIで使ってみたい

■本記事は未解決です■

1.はじめに

先に書いた記事について、最近はやり(?)のescriptを使ってCLIとして実行するのを試しました。

hotch-potch.hatenadiary.jp

ところが、mix経由ではうまく動くのですが、escriptで生成した実行ファイルからだと、エラーが出て動かない現象に当たりました。

2.実行例

(1)mixから実行

$ mix run -e "I2cio.main" 
14:09:51.450 [debug] Elixir.I2cInOut start_link: :"exp:i2c", i2c-1 
14:09:51.463 [debug] Elixir.I2cInOut init_open: "i2c-1" 
now: 0, bit: -1
0
now: 0, bit: 0
1
now: 1, bit: 0
0
now: 0, bit: 1
2
(・・・省略・・・)

(2)escriptを使ってみる

mix.exsの追記

defmodule I2cio.MixProject do
  use Mix.Project

  def project do
    [
      app: :i2cio,
      version: "0.1.0",
      elixir: "~> 1.10",
      start_permanent: Mix.env() == :prod,
      escript: escript(),                     #ここを追加
      deps: deps()
    ]
  end

#(・・・省略・・・)

  defp escript do                     #この関数を追加
    [main_module: I2cio]
  end

ビルド

$ mix escript.build
Generated escript i2cio with MIX_ENV=dev

ビルドはあっさり通ります。

実行

$ ./i2cio

14:10:21.263 [debug] Elixir.I2cInOut start_link: :"exp:i2c", i2c-1 

14:10:21.286 [debug] Elixir.I2cInOut init_open: "i2c-1" 

14:10:21.366 [error] Process #PID<0.100.0> raised an exception
** (ArgumentError) unknown application: :circuits_i2c
    (elixir 1.10.3) lib/application.ex:885: Application.app_dir/1
    (elixir 1.10.3) lib/application.ex:912: Application.app_dir/2
    (circuits_i2c 0.3.6) lib/i2c/i2c_nif.ex:8: Circuits.I2C.Nif.load_nif/0
    (kernel 6.5) code_server.erl:1340: anonymous fn/1 in :code_server.handle_on_load/5

14:10:21.376 [warn]  The on_load function for module Elixir.Circuits.I2C.Nif returned:
{%ArgumentError{message: "unknown application: :circuits_i2c"}, [{Application, :app_dir, 1, [file: 'lib/application.ex', line: 885]}, {Application, :app_dir, 2, [file: 'lib/application.ex', line: 912]}, {Circuits.I2C.Nif, :load_nif, 0, [file: 'lib/i2c/i2c_nif.ex', ...]}, {:code_server, :"-handle_on_load/5-fun-0-", 1, [...]}]}

** (EXIT from #PID<0.96.0>) an exception was raised:
    ** (UndefinedFunctionError) function Circuits.I2C.Nif.open/1 is undefined (module Circuits.I2C.Nif is not available)
        (circuits_i2c 0.3.6) Circuits.I2C.Nif.open('i2c-1')
        (stdlib 3.10) gen_server.erl:374: :gen_server.init_it/2
        (stdlib 3.10) gen_server.erl:342: :gen_server.init_it/6
        (stdlib 3.10) proc_lib.erl:249: :proc_lib.init_p_do_apply/3

iex環境下なら上手く動くので、環境変数のパスが通ってないとか、そういう類いの問題と想像するのだけど・・・今の所、参考になる情報が無いので、もう少し悩んでみます・・・