Десятичный эликсир и :erlang_decimal

Я использую библиотеку erlang под названием erlang_decimal для выполнения десятичной математики. В моем приложении также используется Decimal в качестве подзависимости для Ecto, которая является библиотекой Elixir для практически того же Такие вещи.

Вот мой mix.exs:

  defp deps do
    [
      {:bcrypt_elixir, "~> 1.0"},
      {:comeonin, "~> 4.0"},
      {:configparser_ex, "~> 2.0"},
      {:csv, "~> 2.1.1"},
      {:decimal, "~> 1.0},
      {:ecto_enum, "~> 1.0"},
      {:ecto_sql, "~> 3.0"},
      {:erlang_decimal, "~> 0.4", app: false},
      {:ex_aws, "~> 2.0"},
      {:ex_aws_s3, "~> 2.0"},
      {:ex_machina, "~> 2.2", only: [:dev, :test]},
      {:ex_twilio, "~> 0.6.0"},
      {:gettext, "~> 0.11"},
      {:httpoison, "~> 1.0"},
      {:jason, "~> 1.0"},
      {:phoenix, "~> 1.4.0"},
      {:phoenix_ecto, "~> 4.0"},
      {:phoenix_html, "~> 2.10"},
      {:phoenix_live_reload, "~> 1.0", only: :dev},
      {:phoenix_pubsub, "~> 1.0"},
      {:plug, "~> 1.7"},
      {:plug_cowboy, "~> 2.0"},
      {:postgrex, ">= 0.0.0"},
      {:ranch, "~> 1.3"},
      {:sentry, "~> 7.0"},
      {:signed_overpunch, "~> 0.2"},
      {:sweet_xml, "~> 0.6"},
      {:telcom_parser, in_umbrella: true},
      {:timex, github: "bitwalker/timex", ref: "74afe810ee9c8e58e057830e62a865230ce00133"},
      {:trixie, in_umbrella: true}
    ]
  end

После развертывания изменения я столкнулся со следующим исключением:

  Elixir.UndefinedFunctionError: function Decimal.new/3 is undefined (module Decimal is not available)
    Module "Elixir.Decimal", in Decimal.new/3
    File "lib/postgrex/type_module.ex", line 713, in Postgrex.DefaultTypes."Elixir.Postgrex.Extensions.Numeric"/6
    File "lib/postgrex/protocol.ex", line 2733, in Postgrex.Protocol.rows_recv/4
    File "lib/postgrex/protocol.ex", line 1777, in Postgrex.Protocol.recv_execute/5
    File "lib/postgrex/protocol.ex", line 1652, in Postgrex.Protocol.bind_execute/4
    File "lib/db_connection/holder.ex", line 268, in DBConnection.Holder.holder_apply/4
    File "lib/db_connection.ex", line 1189, in DBConnection.run_execute/5
    File "lib/db_connection.ex", line 1276, in DBConnection.run/6
    Module "erlang", in :erlang.apply/2

Происходит ли какой-то конфликт пространства имен?

Редактировать:

Dialyzer может решить эту проблему:

Total errors: 6, Skipped: 0
done in 0m5.83s
:0:unknown_function
Function Decimal.compare/2 does not exist.
________________________________________________________________________________
:0:unknown_function
Function Decimal.div/2 does not exist.
________________________________________________________________________________
:0:unknown_function
Function Decimal.mult/2 does not exist.
________________________________________________________________________________
:0:unknown_function
Function Decimal.new/1 does not exist.
________________________________________________________________________________
:0:unknown_function
Function Decimal.round/3 does not exist.
________________________________________________________________________________
:0:unknown_function
Function Decimal.to_integer/1 does not exist.
________________________________________________________________________________
done (warnings were emitted)

Я обновил mix.exs, чтобы включить {:decimal, "~> 1.0"}


person Zoidberg    schedule 22.01.2019    source источник


Ответы (1)


Согласно документам Decimal, которые вы связали:

Добавьте Decimal в качестве зависимости в файле mix.exs.

def deps do
  [{:decimal, "~> 1.0"}]
end

Тем не менее, в опубликованном вами файле mix.exs эта зависимость не указана. Кроме того, в сообщении об ошибке говорится:

(модуль Decimal недоступен)

что также указывает на то, что вам нужно добавить модуль Decimal в ваше приложение.

==========

После того, как я изо всех сил пытался заставить erlang_decimal работать, я попытался добавить еще одну зависимость к mix.exs:

 defp deps do
    [
      {:decimal, "~> 0.4.3", hex: :erlang_decimal},
      {:decimal, "~> 1.6"}

    ]

И это был результат:

Предупреждение о миксе deps.get: зависимость :decimal дублируется на верхнем уровне, пожалуйста, удалите одну из них.

В mix.exs: {:decimal, "~> 0.4.3", [env: :prod, repo: "hexpm", hex: "erlang_decimal"]}

В mix.exs: {:decimal, "~> 1.6", [env: :prod, repo: "hexpm", hex: "decimal"]}

Убедитесь, что они соответствуют или укажите один из вышеперечисленных в ваших зависимостях и установите «override: true» ** (Mix) Невозможно продолжить из-за ошибок в зависимостях.

Затем см.:

https://elixirforum.com/t/how-can-i-specify-multiple-dependencies-that-have-the-same-name/926

а также:

https://elixirforum.com/t/working-with-modules-with-same-name/11364/6

person 7stud    schedule 22.01.2019