■本記事は未解決です■
1.はじめに
先に書いた記事について、最近はやり(?)のescriptを使ってCLIとして実行するのを試しました。
ところが、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環境下なら上手く動くので、環境変数のパスが通ってないとか、そういう類いの問題と想像するのだけど・・・今の所、参考になる情報が無いので、もう少し悩んでみます・・・