Elixir - 如何在制作escript应用程序时包含依赖项?

时间:2017-05-02 10:03:30

标签: elixir

我正在尝试在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

1 个答案:

答案 0 :(得分:3)

0.1.x之后的

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}