Переопределение кодировщиков отравления

Я пытаюсь создать выпуск своего приложения Phoenix с помощью Distillery, и я переопределил кодировщики Poison для DateTime и NaiveDateTime, чтобы они соответствовали требованиям API.

Когда я запускаю mix release, мое приложение компилируется, но я получаю сообщение об ошибке во время создания .boot.

Вот трассировка стека:

$> mix release
warning: variable "aliases" does not exist and is being expanded to "aliases()", please use parentheses to remove the ambiguity or change the variable name
  mix.exs:12

warning: variable "deps" does not exist and is being expanded to "deps()", please use parentheses to remove the ambiguity or change the variable name
  mix.exs:13

==> Assembling release..
==> Building release helios:1.0.0 using environment dev
==> One or more direct or transitive dependencies are missing from
    :applications or :included_applications, they will not be included
    in the release:

    :ex_admin
    :floki
    :geo
    :guardian
    :json_web_token
    :mogrify
    :phoenix_pubsub
    :scrivener_ecto
    :timex
    :timex_ecto

    This can cause your application to fail at runtime. If you are sure
    that this is not an issue, you may ignore this warning.

==> Release failed, during .boot generation:
        Duplicated modules:
        'Elixir.Poison.Encoder.NaiveDateTime' specified in poison and helios
        'Elixir.Poison.Encoder.Ecto.DateTime' specified in ecto and helios

Есть ли способ переопределить кодировщики отравления, не сталкиваясь с этой проблемой?

РЕДАКТИРОВАТЬ: Вот кодеры, которые у меня есть:

  defimpl Poison.Encoder, for: Ecto.DateTime do
    def encode(datetime, options) do

      dt = datetime |> Ecto.DateTime.to_erl
      |> Timex.Timezone.convert("UTC")
      |> Timex.format("{ISO:Extended}")
      |> elem(1)

      <<?", dt::binary, ?">>
    end
  end

  defimpl Poison.Encoder, for: NaiveDateTime do
    def encode(datetime, options) do

      dt = datetime
      |> Timex.Timezone.convert("UTC")
      |> Timex.format("{ISO:Extended}")
      |> elem(1)

      <<?", dt::binary, ?">>
    end
  end

person Rohith Varanasi    schedule 21.04.2017    source источник


Ответы (1)


Вы, вероятно, хотите реализовать протокол. Документы дают этот пример:

defimpl Poison.Encoder, for: Person do
  def encode(%{name: name, age: age}, options) do
    Poison.Encoder.BitString.encode("#{name} (#{age})", options)
  end
end

Если вы не знакомы с протоколами, опубликуйте свои собственные кодировщики, и мы можем помочь с протоколом.

РЕДАКТИРОВАТЬ:

Итак, после долгих поисков оказалось, что Poison не позволяет переопределять базовые типы. У них уже есть реализация в пакете. Итак, когда вы переопределяете их в своем проекте, вы создаете две версии файлов луча.

Уже открыта эта проблема.

person Steve Pallen    schedule 21.04.2017
comment
Это то, что я сейчас сделал, но получаю ошибку duplicated modules. Кажется, что Distillery и exrm не нравится, если я переопределяю энкодеры для DateTime и NaiveDateTime :/ - person Rohith Varanasi; 22.04.2017
comment
Я предполагаю, что ваш проект называется :helios. Сообщение об ошибке, которое вы получаете, указывает на то, что у вас есть локальная копия модуля Elixir.Poison.Encoder.NaiveDateTime в вашем проекте. То же самое для другого модуля. Убедитесь, что в вашем проекте нет этих модулей. Кстати, макрос defimpl не определяет модуль, он только реализует протокол. Если у вас нет собственной локальной копии, я бы порекомендовал вам попробовать mix clean и снова собрать свой релиз. Вы также можете попробовать mix release.clean - person Steve Pallen; 22.04.2017
comment
Я обновил сообщение, чтобы включить свои пользовательские кодировщики. Я попробовал mix clean и mix release.clean и снова запустил mix release, но снова столкнулся с теми же ошибками. Кстати, спасибо за помощь, ценю это! Кроме того, вам нравится ваша работа над ExAdmin, мы тоже этим пользуемся :) - person Rohith Varanasi; 22.04.2017
comment
Есть только 2 вещи, которые я могу придумать, чтобы решить эту проблему. 1, у вас есть исходный файл где-то в вашем локальном проекте, который содержит определение модуля для Poison.Encoder.NaiveDateTime, или 2. у вас есть файл луча, который подхватывается выпуском микса. Если вы уже выполнили grep в своем проекте для Poison.Encoder.NaiveDateTime, вы удалите папки deps и _build. Затем запустите mix do deps.get, compile - person Steve Pallen; 22.04.2017
comment
Поэтому у меня нет определения модуля для Poison.Encoder.NaiveDateTime, когда я выполняю grep в своих папках web и lib. Однако они отображаются в моем каталоге _build как файлы .beam как в _build/dev/lib/helios, так и в _build/dev/lib/poison и _build/dev/consolidated. - person Rohith Varanasi; 22.04.2017
comment
Попробуйте удалить файлы луча в папке _build/dev/lib/helios. Кроме того, я предполагаю, что вы создаете выпуск для среды разработки. - person Steve Pallen; 22.04.2017
comment
Давайте продолжим обсуждение в чате. - person Rohith Varanasi; 22.04.2017