我正在尝试在Elixir中创建一个小的CLI应用程序作为学习项目。该程序的一部分将需要一些日期时间处理,因此我来到Elixir库[日历] [日历]。
当我使用以下命令构建它时,它确实包含了[calendar]的依赖项:
(mix clean &&)? mix escript.build
因为它抛出了这个错误:
Could not start application tzdata: exited in: Tzdata.App.start(:normal, [])
** (EXIT) an exception was raised:
** (MatchError) no match of right hand side value: {:error, {:shutdown, {:failed_to_start_child, Tzdata.EtsHolder, {%ArgumentError{message: "unknown application: :tzdata"}, [{Application, :app_dir, 1, [file: 'lib/application.ex', line: 428]}, {Application, :app_dir, 2, [file: 'lib/application.ex', line: 437]}, {Tzdata.EtsHolder, :release_dir, 0, [file: 'lib/tzdata/ets_holder.ex', line: 86]}, {Tzdata.EtsHolder, :make_sure_a_release_dir_exists, 0, [file: 'lib/tzdata/ets_holder.ex', line: 70]}, {Tzdata.EtsHolder, :make_sure_a_release_is_on_file, 0, [file: 'lib/tzdata/ets_holder.ex', line: 64]}, {Tzdata.EtsHolder, :init, 1, [file: 'lib/tzdata/ets_holder.ex', line: 10]}, {:gen_server, :init_it, 6, [file: 'gen_server.erl', line: 328]}, {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 247]}]}}}}
(tzdata) lib/tzdata/tzdata_app.ex:15: Tzdata.App.start/2
(kernel) application_master.erl:273: :application_master.start_it_old/4
我的 mix.exs 如下:
defmodule Cascli.Mixfile do
use Mix.Project
def project do
[app: :cascli,
version: "0.1.0",
elixir: "~> 1.4",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
escript: escript(),
deps: deps()]
end
def escript do
[ main_module: Cascli ]
end
def application do
[ extra_applications: [ :logger, :calendar, :tzdata ] ]
end
defp deps do
[
{ :poison,
"~> 3.0" },
{ :calendar,
"~> 0.16.1" },
{ :tzdata, # Tried with and without this dependency
"~> 0.5.12" } # with no luck.
]
end
end
我已经谷歌搜索并发现[问题] [问题-5538]由[此拉请求] [pull-5540]解决,但它似乎并没有真正解决这个特殊情况。然而,它确实涉及escript构建而没有考虑依赖关系的依赖性。我只是不知道这是一个Elixir问题还是我的设置/依赖项问题。即使我尝试使用或不使用deps和 extra_applications 字段中的:tzdata 条目,错误也是相同的。
至于为什么它根本找不到tzdata,无论我是否依赖自己,它仍然无法避开我。
[calendar]:https://github.com/lau/calendar
[pull-5540]:https://github.com/elixir-lang/elixir/pull/5540
[issue-5538]:https://github.com/elixir-lang/elixir/issues/5538
答案 0 :(得分:3)
tzdata
版本目前不支持escript,因为它们使用:ets.file2tab
将转储加载到ETS表which doesn't play well with escript archives中。这是known issue,如果您需要与escript兼容,目前推荐的解决方案是使用tzdata的0.1.x
版本。在您的deps中,您可以覆盖tzdata
的版本:
{:tzdata, "~> 0.1", override: true}