【发布时间】:2018-08-14 04:49:48
【问题描述】:
我希望在 Elixir Umbrella project 中构建一个 escript。 我有两个同级应用 Compressor 和 Printer
Compressor 依赖于 snappyer package,它是 google 快速压缩算法的 nif 包装器。
# apps/compressor/mix.exs
defmodule Compressor.MixProject do
# ..
defp deps do
[
{:snappyer, "~> 1.2.4"},
]
end
end
# apps/compressor/lib/compressor.ex
defmodule Compressor do
def compress(message) do
:snappyer.compress(message)
end
end
打印机需要Compressor,压缩一些数据并打印结果。
# apps/printer/mix.exs
defmodule Printer.MixProject do
# ..
def project do
[
app: :printer,
version: "0.1.0",
build_path: "../../_build",
config_path: "../../config/config.exs",
deps_path: "../../deps",
lockfile: "../../mix.lock",
elixir: "~> 1.7",
escript: escript(),
start_permanent: Mix.env() == :prod,
deps: deps()
]
end
defp escript do
[main_module: Printer.CLI]
end
defp deps do
[
{:compressor, in_umbrella: true},
]
end
end
# apps/printer/lib/printer/cli.ex
defmodule Printer.CLI do
def main(args \\ []) do
IO.inspect Compressor.compress(<<1, 2, 3>>)
end
end
当我通过 mix 运行 Printer.CLI.main([]) 时,它会按预期打印结果
$ mix run -e "Printer.CLI.main([])"
{:ok, <<3, 8, 1, 2, 3>>}
但是,当我通过 escript 运行它时,它会失败:
$ cd apps/printer && mix escript.build && ./printer
Generated escript printer with MIX_ENV=dev
** (UndefinedFunctionError) function :snappyer.compress/1 is undefined (module :snappyer is not available)
(snappyer) :snappyer.compress(<<1, 2, 3>>)
(printer) lib/printer/cli.ex:3: Printer.CLI.main/1
(elixir) lib/kernel/cli.ex:105: anonymous fn/3 in Kernel.CLI.exec_fun/2
兄弟伞应用程序中是否允许使用 escript?如果没有,是否有任何已知的解决方法?
【问题讨论】:
标签: elixir