Эликсир: когда использовать.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). Код может быть вызван (если он определяет общедоступные функции или макросы) в другом месте приложения или из. Это значение по умолчанию.
Вероятно, наиболее важным фактором при выборе между и является то, где (и когда) я хочу вызвать этот код:
- В самом приложении -
- От (например,
iex -S mix
) -, если код также (или, вероятно, будет) использоваться приложением; для «специальных» скриптов, например, для конкретной ошибки или другой проблемы - Из оболочки через
mix
- для пользовательских задач Mix или в виде данных (для простых псевдонимов задач) - Из оболочки, т.е. как «обычный скрипт» - и запускать через.
Что может быть удивительно, так это то, что хороший фрагмент кода, который начинается с одного из [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/