Эликсир: когда использовать.ex и когда.exs файлы

Документация по эликсирам гласит, что

В дополнение к расширению файла Elixir.ex, Elixir также поддерживает файлы.exs для сценариев. Elixir обрабатывает оба файла одинаково, единственное отличие заключается в намерении. Файлы.ex предназначены для компиляции, а файлы.exs используются для сценариев без необходимости компиляции.

Но я все еще не уверен, когда использовать какой тип файла. Каковы недостатки и цели.ex и.exs?

5 ответов

Решение

.ex для скомпилированного кода, .exs для интерпретированного кода.

Тесты ExUnit, например, находятся в .exs файлы, чтобы вам не приходилось перекомпилировать каждый раз, когда вы вносите изменения в свои тесты. Если вы пишете сценарии или тесты, используйте .exs файлы. В противном случае просто используйте .ex файлы и скомпилируйте свой код.

Что касается плюсов / минусов, интерпретация будет выполняться дольше (так как elixir должен анализировать, токенизировать и т. Д.), Но не требует компиляции для запуска. Вот и все - если гибкость запуска сценариев важнее, чем оптимизированное время выполнения, используйте .exs, Большую часть времени вы будете использовать .ex,

Elixir скомпилирует весь файл.ex. Файлы.exs также компилируются, но должны выполняться при вызове. Таким образом, большинство случаев использования файлов.exs заключается в немедленном выполнении кода при вызове. Подумайте об использовании файлов.exs для тестирования, переноса данных и запуска скриптов. Представьте, что файлы.ex используются в качестве основной бизнес-логики вашего приложения.

Рассмотрим этот пример

пример

sum.ex

defmodule Sum do
  add(a, b) do
     a + b
  end
end

$ iex sum.ex

iex> Sum.add(1,2)
3

пример.exs

sum.exs

defmodule Sum do
  def add(a,b)  do
    a + b
  end
end

#within same file

IO.puts "The sum of 3 + 2 is: #{inspect Sum.add(3, 2}"

$ elixir sum.exs

 ->> "The sum of 3 + 2 is: 5"

Проверяю в Эликсире версии 1.9.1 и в обоих расширениях .ex, .exs будет скомпилирован с elixirc. Другими словами, получаем байт-код (.beam файл) в обоих случаях.

Для некоторых более конкретных деталей, вот несколько шаблонов или практических правил, которые я заметил о том, когда использовать файлы vs:

Почти весь код находится в файле в дереве каталогов библиотеки моего приложения, например, в lib (или, может быть webесли приложение является старым веб-приложением Phoenix). Код может быть вызван (если он определяет общедоступные функции или макросы) в другом месте приложения или из. Это значение по умолчанию.

Вероятно, наиболее важным фактором при выборе между и является то, где (и когда) я хочу вызвать этот код:

  1. В самом приложении -
  2. От (например, iex -S mix) -, если код также (или, вероятно, будет) использоваться приложением; для «специальных» скриптов, например, для конкретной ошибки или другой проблемы
  3. Из оболочки через mix - для пользовательских задач Mix или в виде данных (для простых псевдонимов задач)
  4. Из оболочки, т.е. как «обычный скрипт» - и запускать через.

Что может быть удивительно, так это то, что хороший фрагмент кода, который начинается с одного из [2], [3] или [4], в конечном итоге все равно заканчивается в [1].

И действительно важно помнить, что переносить код ЛЕГКО, например, из .exs файл в .ex файл (или наоборот).

Для [2] и, в частности, для одного приложения, я установил несколько дополнительных сред Mix «режим сценариев» для использования с. По сути, они запускают базовый локальный экземпляр dev (части) приложения, но подключаются к производственной / промежуточной БД (или другим серверным службам). У меня есть несколько вспомогательных функций / макросов для этих «командных сред», но в основном я просто использую код приложения, например, для запроса производственной / промежуточной базы данных и исправления / очистки / проверки некоторых данных. Если мне действительно нужно сделать что-то даже немного «сложное» (сложное), я обычно создаю специальный «скрипт проблемы». В моем редакторе писать код намного проще, чем в.

Для специальных сценариев для [2] у меня есть dev/scripts sub-directory-tree в одном проекте и в основном просто именуют специальные сценарии на основе соответствующего номера тикета (из тикет-системы этого проекта), например. 123.exs. Затем я могу легко запустить этот скрипт:

      iex> c "dev/scripts/123.exs"

Один из хороших «рабочих процессов» - просто определить один модуль (верхнего уровня) в файле сценария:

      defmodule Ticket123 do

  ...

  def do_some_one_off_thing ...

end

Тогда из:

      iex> c "dev/scripts/123.exs"
[Ticket123]
iex> Ticket123.do_some_one_off_thing ...
Something something
...

Для [3] оба псевдонима задач в вашем проекте mix.exs и «полностью» кастомные задачи Mix действительно хороши.

Несколько примеров псевдонимов из одного проекта:

  • Выполнить "все" миграции - у этого проекта есть регулярные ( Ecto) миграции баз данных И некоторые миграции, которые мы хотим выполнить «вручную» (т.е. с использованием среды «режима сценариев», упомянутой выше). Мы используем ручную миграцию для таких вещей, как длительные запросы / команды к базе данных, например. добавление или изменение индекса в большой таблице.
  • Развернуть на стадии подготовки / производства
  • test - это затеняет встроенную задачу Mix, чтобы выполнить некоторую настраиваемую настройку локальной базы данных.
  • todo - вывод результатов поиска по TODO-комментариям в нашем (Elixir) коде

Некоторые примеры пользовательских задач из того же проекта:

  • Mix.Tasks.OneProject.BootstrapServer - некоторый специальный код {управление конфигурацией / автоматическое развертывание инфраструктуры}
  • Mix.Tasks.OneProject.DbSetup - извлекает некоторые данные конфигурации из приложения Elixir, но в основном просто передает их в сценарий оболочки
  • Mix.Tasks.OneProject.ImportTranslations - загружает переводы и другие данные интернационализации от сторонних организаций
  • Mix.Tasks.OneProject.RollingDeploy - настраиваемое развертывание, использующее что-то вроде «сине-зеленой» модели, но с балансировщиком нагрузки вместо двух полностью отдельных сред / экземпляров

Я вообще не использовал полностью «обычные» файлы скриптов Elixir ни в одном проекте - для вызова через elixir some-script.exs. Вероятно, самая большая причина не делать этого, то есть просто создавать настраиваемую задачу Mix или «сценарий проблемы», заключается в том, что настраиваемые задачи Mix хорошо документированы, т. Е. Через mix help а также mix help some-custom-mix-task, и мне очень нравится работать над REPL ( iex).

В Elixir есть два типа файлов: файл сценария (с расширением.exs) и файл кода (с расширением.ex). Разница в том, что файлы с расширением.ex предназначены для компиляции с elixirc, тогда как.exs предназначены для непосредственного использования с elixir.

Источник: http://blog.distortedthinking.agency/articles/functions-functions-and-more-functions/

Другие вопросы по тегам