Возможно ли в Elixir условное присутствие кода в зависимости от среды Mix?

В основном, как #ifdef/#else/#endif в C/C++, я хочу, чтобы некоторый код присутствовал во время mix test и удалялся в рабочей среде, поэтому мне не нужно проверять Mix.env == :test в фрагменте кода, который очень часто вызывается.

Я знаю, что это считается плохой практикой, но возможно ли это и как?


person raarts    schedule 27.10.2017    source источник
comment
В какой файл вы хотите добавить это? Как насчет if Mix.env == :test do ... end?   -  person Dogbert    schedule 27.10.2017
comment
@Dogbert, как насчет того, чтобы просто поместить код в test/test_helper.exs? :)   -  person Aleksei Matiushkin    schedule 27.10.2017
comment
@mudasobwa: я так и думал, и во всех документах говорится, что Mix недоступен в производстве, но мои тесты для Mix.env каким-то образом работают в производстве.   -  person raarts    schedule 27.10.2017
comment
Как вы развертываете продукт?   -  person Aleksei Matiushkin    schedule 27.10.2017
comment
Используя дистиллерию, но забудьте о том, что я сказал. Я установил глобальную конфигурацию с именем env = Mix.env() и протестировал ее в рабочей среде.   -  person raarts    schedule 27.10.2017


Ответы (2)


При создании выпуска доступно Mix. В самом релизе его нет. Если вы уверены, что хотите, чтобы код был удален из релизной версии, используйте макрос:

defmodule StrippedInRelease do
  defmacro fun(do: block) do
    if Mix.env == :test do
      block # AST as by quote do: unquote(block)
    end
  end
end

и используйте его как:

require StrippedInRelease
StrippedInRelease.fun do
  def yo, do: IO.puts "¡yo!"
end

Он должен быть расширен во время во время компиляции, и, следовательно, все, что передается как блок, будет определено в среде :test и удалено в других средах.

person Aleksei Matiushkin    schedule 27.10.2017
comment
Я считаю, что quote do: unquote(block) это то же самое, что и block. - person Dogbert; 27.10.2017

Стоит упомянуть вариант — загрузка специального кода env после сборки — вот тот, который я использую для получения файла семян, специфичного для env:

# Capture the mix environment at build time
defmacro mix_build_env() do
  Atom.to_string( Mix.env )
end

def seeds_path(repo) do
  mix_env = mix_build_env()
  # IO.puts(:stderr, "env:  #{inspect x} " )
  priv_path_for(repo, mix_env  <>  "_seeds.exs")
end
person bryan hunt    schedule 16.11.2018