【问题标题】:Elixir - How to include dependencies when making an escript application?Elixir - 制作 escript 应用程序时如何包含依赖项?
【发布时间】:2017-05-03 03:24:03
【问题描述】:

我正在尝试在 Elixir 中创建一个小的 CLI 应用程序作为一个学习项目。该程序的某些部分将需要一些日期时间处理,因此我遇到了 Elixir 库 [Calendar][calendar]。

当我使用以下命令构建它时,它似乎确实包含了 [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

我在 Google 上搜索并发现了一个 [issue][issue-5538] 已由 [this pull request][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

【问题讨论】:

  • 尝试将tzdata 的版本覆盖为0.1.8。请参阅github.com/bitwalker/timex/issues/86#issuecomment-147517762 了解更多信息。
  • @Dogbert 天哪,这太疯狂了。我希望我早一点发现。谢谢!如果您想通过解释来回答问题(由于依赖于从文件加载的 ETS 表,因此 0.1.x 以上的版本无法运行。显然,您在 escripts 中无法做到这一点?

标签: elixir


【解决方案1】:

tzdata 0.1.x 之后的版本目前不能与 escript 一起使用,因为它们使用 :ets.file2tab 将转储加载到 ETS 表 which doesn't play well with escript archives。这是knownissue,如果您需要与 escript 兼容,当前推荐的解决方案是使用 tzdata 的0.1.x 版本。在您的部门中,您可以覆盖 tzdata 的版本:

{:tzdata, "~> 0.1", override: true}

【讨论】:

  • 这完全回答了我的问题,即为什么我在尝试运行我的 escript 时遇到错误。但是我不确定我是否可以恢复,因为 tzdata 不是我的直接依赖项,而是 Calendar 的依赖项(我必须检查一下)。不过接受答案:) 谢谢!
  • override: true 将覆盖嵌套依赖项,因此它应该适合您。
  • 我昨天确实试了一下,但第一次尝试它没有用。不过我没时间看看为什么,所以今天下班后我会调查:)
  • 当然,如果它不起作用,请告诉我。我在发布答案之前尝试了它,它也可以在没有 override 的情况下工作。
  • 可能是必须清理我安装的 deps 或其他东西。所以我会看看我能弄清楚什么。再次感谢! :)
猜你喜欢
  • 2010-09-11
  • 1970-01-01
  • 2021-04-29
  • 2015-12-13
  • 2014-04-04
  • 2014-05-28
  • 2016-12-12
  • 1970-01-01
相关资源
最近更新 更多