Spec-Zone.ru › Elixir 1.13

Приложение поведение

Модуль для работы с приложениями и определения обратных вызовов приложений.

Приложения — это стандартный способ упаковать программное обеспечение в Erlang/OTP. По своей идее они аналогичны понятию «библиотека», распространенному в других языках программирования, но с некоторыми дополнительными характеристиками.

Приложение — это компонент, реализующий определенную функциональность, со стандартной структурой каталогов, конфигурацией и жизненным циклом. Приложения загружаются, запускаются и останавливаются. Каждое приложение также имеет свою собственную среду, которая предоставляет унифицированный API для конфигурирования каждого приложения.

Разработчики обычно взаимодействуют со средой приложения и его модулем обратных вызовов. Поэтому мы рассмотрим эти темы перед переходом к деталям файла ресурсов приложения и его жизненного цикла.

Среда приложения

У каждого приложения есть своя среда. Среда — это список ключевых слов, сопоставляющий атомы с терминами. Обратите внимание, что эта среда не связана со средой операционной системы.

По умолчанию среда приложения — это пустой список. В файле mix.exs проекта Mix вы можете установить ключ :env в application/0.

def application do
  [env: [db_host: "localhost"]]
end

Теперь в вашем приложении вы можете прочитать эту среду, используя такие функции, как fetch_env!/2 и аналогичные:

defmodule MyApp.DBClient do
  def start_link() do
    SomeLib.DBClient.start_link(host: db_host())
  end

  defp db_host do
    Application.fetch_env!(:my_app, :db_host)
  end
end

В проектах Mix среда приложения и его зависимостей может быть переопределена через файлы config/config.exs и config/runtime.exs. Первый загружается во время компиляции, до компиляции вашего кода, а второй — во время выполнения, непосредственно перед запуском вашего приложения. Например, кто-то, использующий ваше приложение, может переопределить переменную среды :db_host следующим образом:

import Config
config :my_app, :db_host, "db.local"

См. раздел «Конфигурация» в модуле Mix для получения дополнительной информации.

Вы также можете динамически изменять среду приложения, используя функции, такие как put_env/3 и delete_env/2. Однако, как правило, каждое приложение отвечает за свою собственную среду. Пожалуйста, не используйте функции в этом модуле для прямого доступа к среде или изменения среды других приложений.

Среда времени компиляции

В предыдущем примере мы считали среду приложения во время выполнения:

defmodule MyApp.DBClient do
  def start_link() do
    SomeLib.DBClient.start_link(host: db_host())
  end

  defp db_host do
    Application.fetch_env!(:my_app, :db_host)
  end
end

Другими словами, ключ среды :db_host для приложения :my_app будет считан только при фактическом запуске MyApp.DBClient. Хотя чтение среды приложения во время выполнения является предпочтительным подходом, в некоторых редких случаях вы можете захотеть использовать среду приложения для конфигурирования компиляции определенного проекта. Это часто делается путем вызова get_env/3 вне функции:

defmodule MyApp.DBClient do
  @db_host Application.get_env(:my_app, :db_host, "db.local")

  def start_link() do
    SomeLib.DBClient.start_link(host: @db_host)
  end
end

Этот подход имеет одно существенное ограничение: если вы измените значение среды приложения после компиляции кода, значение, используемое во время выполнения, не изменится! Например, если ваш файл config/runtime.exs содержит:

config :my_app, :db_host, "db.production"

Это значение не повлияет, так как код был скомпилирован для подключения к «db.local», что, скорее всего, недоступно в производственной среде.

По этим причинам чтение среды приложения во время выполнения должно быть приоритетным выбором. Однако, если вам действительно нужно прочитать среду приложения во время компиляции, мы рекомендуем использовать compile_env/3 вместо этого:

require Application
@db_host Application.compile_env(:my_app, :db_host, "db.local")

Используя compile_env/3, такие инструменты, как Mix, будут сохранять значения, используемые во время компиляции, и сравнивать значения компиляции со значениями времени выполнения при каждом запуске вашей системы, вызывая ошибку в случае их расхождения.

Модуль обратного вызова приложения

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

{:ok, _} = Application.ensure_all_started(:some_app)

При запуске приложения разработчики могут настроить модуль обратного вызова, который выполняет пользовательский код. Разработчики используют этот обратный вызов для запуска дерева наблюдения приложения.

Первый шаг — добавить ключ :mod к определению application/0 в вашем файле mix.exs. Он ожидает кортеж с модулем обратного вызова приложения и аргументом запуска (обычно пустым списком):

def application do
  [mod: {MyApp, []}]
end

Модуль MyApp , переданный в :mod, должен реализовывать поведение Application. Это можно сделать, поместив use Application в этот модуль и реализовав обратный вызов start/2, например:

defmodule MyApp do
  use Application

  def start(_type, _args) do
    children = []
    Supervisor.start_link(children, strategy: :one_for_one)
  end
end

Обратный вызов start/2 должен создать и связать супервайзор и вернуть {:ok, pid} или {:ok, pid, state}, где pid — PID супервайзора, а state — необязательное состояние приложения. args — это второй элемент кортежа, переданного опции :mod.

Аргумент type, переданный start/2, обычно :normal, за исключением распределенной настройки, где настраиваются перехваты и отказоустойчивость приложений. Распределенные приложения выходят за рамки этой документации.

При завершении работы приложения вызывается его обратный вызов stop/1 после остановки дерева наблюдения временем выполнения. Этот обратный вызов позволяет приложению выполнить любые окончательные действия по очистке. Аргументом является состояние, возвращенное start/2, если оно было, или [] в противном случае. Возвращаемое значение stop/1 игнорируется.

Используя Application, модули получают реализацию по умолчанию stop/1, которая игнорирует свой аргумент и возвращает :ok, но ее можно переопределить.

Модули обратных вызовов приложения также могут реализовать необязательный обратный вызов prep_stop/1. Если он присутствует, prep_stop/1 вызывается перед завершением дерева наблюдения. Его аргументом является состояние, возвращенное start/2, если оно было, или [] в противном случае, а его возвращаемое значение передается в stop/1.

Файл ресурсов приложения

В предыдущих разделах мы настраивали приложение в разделе application/0 файла mix.exs. В конечном итоге Mix использует эту конфигурацию для создания файла файла ресурсов приложения, который называется APP_NAME.app. Например, файл ресурсов приложения для приложения OTP ex_unit называется ex_unit.app.

Дополнительные сведения о генерации файлов ресурсов приложения можно найти в документации по Mix.Tasks.Compile.App, а также вы можете получить к ним доступ, выполнив mix help compile.app.

Жизненный цикл приложения

Загрузка приложений

Приложения загружаются, что означает, что среда выполнения находит и обрабатывает их файлы ресурсов:

Application.load(:ex_unit)
#=> :ok

При загрузке приложения среда, указанная в его файле ресурсов, объединяется с любыми переопределениями из файлов конфигурации.

Загрузка приложения не загружает его модули.

На практике вы редко загружаете приложения вручную, потому что это часть процесса запуска, который описан далее.

Запуск приложений

Приложения также запускаются:

Application.start(:ex_unit)
#=> :ok

После компиляции вашего приложения, запуск вашей системы сводится к запуску текущего приложения и его зависимостей. В отличие от других языков, в Elixir нет процедуры main, которая отвечает за запуск вашей системы. Вместо этого вы запускаете одно или несколько приложений, каждое со своей логикой инициализации и завершения работы.

При запуске приложения функция Application.load/1 вызывается автоматически, если она еще не была выполнена. Затем она проверяет, были ли уже запущены зависимости, указанные в ключе applications файла ресурсов. Наличие хотя бы одной незапущенной зависимости — это условие ошибки. Функции, такие как ensure_all_started/1, позаботятся о запуске приложения и всех его зависимостей за вас.

Если у приложения не настроен модуль обратного вызова, запуск выполняется на этом этапе. В противном случае вызывается обратный вызов start/2. PID супервайзора верхнего уровня, возвращенный этой функцией, сохраняется средой выполнения для последующего использования, а возвращаемое состояние приложения также сохраняется, если таковое имеется.

Остановка приложений

Запущенные приложения, наконец, останавливаются:

Application.stop(:ex_unit)
#=> :ok

Остановка приложения без настроенного модуля обратного вызова определена, но, за исключением некоторых системных отслеживаний, на практике это бесполезная операция.

Остановка приложения с настроенным модулем обратного вызова включает три шага:

  1. Если он существует, вызывается необязательный обратный вызов prep_stop/1.
  2. Завершается супервайзор верхнего уровня.
  3. Вызывается обязательный обратный вызов stop/1.

Аргументы, передаваемые обратным вызовам, связаны со состоянием, возвращаемым необязательно start/2, и документированы в разделе о модуле обратных вызовов выше.

Важно отметить, что шаг 2 является блокирующим. Завершение супервайзора вызывает рекурсивную цепочку завершений дочерних процессов, поэтому происходит упорядоченное завершение работы всех зависимых процессов. Обратный вызов stop/1 вызывается только после завершения всего дерева наблюдения.

Чистое завершение работы активной системы можно выполнить, вызвав System.stop/1. Он завершит работу каждого приложения в обратном порядке их запуска.

По умолчанию, сигнал SIGTERM из операционной системы автоматически переводится в System.stop/0. Вы также можете получить больший контроль над сигналами операционной системы с помощью функции :os.set_signal/2.

Инструменты

Инструмент сборки Mix автоматизирует большинство задач управления приложениями. Например, mix test автоматически запускает зависимости вашего приложения и само приложение перед запуском тестов. mix run --no-halt запускает текущий проект и может использоваться для запуска долгоживущей системы. См. mix help run.

Разработчики также могут использовать mix release для создания сборок. Сборки способны упаковать весь исходный код, а также виртуальную машину Erlang в один каталог. Сборки также предоставляют явный контроль над тем, как запускается каждое приложение и в каком порядке. Они также обеспечивают более удобный механизм для запуска и остановки систем, отладки, ведения журналов, а также мониторинга системы.

Наконец, Elixir предоставляет инструменты, такие как escripts и архивы, которые представляют собой различные механизмы для упаковки вашего приложения. Обычно они используются, когда инструменты должны быть общими для разработчиков, а не как варианты развертывания. Подробнее см. mix help archive.build и mix help escript.build.

Дополнительная информация

Для получения дополнительной информации об приложениях, пожалуйста, обратитесь к документации модуля :application Erlang и разделу «Приложения» в Приложения руководства по принципам проектирования OTP.

Обзор

Типы

app()
application_key()
key()
restart_тип()
тип_запуска()
состояние()
значение()

Обработчики событий

config_change(changed, new, removed)

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

prep_stop(состояние)

Вызывается перед остановкой приложения.

start(тип_запуска, аргументы_запуска)

Вызывается при запуске приложения.

start_phase(фаза, тип_запуска, аргументы_фазы)

Запускает приложение в синхронных фазах.

stop(состояние)

Вызывается после остановки приложения.

Функции

app_dir(приложение)

Возвращает каталог для приложения.

app_dir(приложение, путь)

Возвращает указанный путь внутри app_dir/1.

compile_env!(приложение, ключ_или_путь)

Считывает среду приложения во время компиляции или вызывает ошибку.

compile_env(приложение, ключ_или_путь, значение_по_умолчанию \\ nil)

Считывает среду приложения во время компиляции.

delete_env(приложение, ключ, параметры \\ [])

Удаляет key из заданной app среды.

ensure_all_started(приложение, тип \\ :temporary)

Обеспечивает запуск заданного app и его приложений.

ensure_loaded(приложение)

Обеспечивает загрузку заданного app.

ensure_started(приложение, тип \\ :temporary)

Обеспечивает запуск заданного app.

fetch_env!(приложение, ключ)

Возвращает значение для key в среде app.

fetch_env(приложение, ключ)

Возвращает значение для key в среде app в кортеже.

format_error(причина)

Форматирует причину ошибки, возвращенную функциями start/2, ensure_started/2, stop/1, load/1 и unload/1, возвращает строку.

get_all_env(приложение)

Возвращает все пары ключ-значение для app.

get_application(модуль)

Получает приложение для заданного модуля.

get_env(приложение, ключ, значение_по_умолчанию \\ nil)

Возвращает значение для key в среде app.

load(приложение)

Загружает заданное app.

loaded_applications()

Возвращает список с информацией о загруженных приложениях.

put_all_env(конфигурация, параметры \\ [])

Устанавливает среду для нескольких приложений одновременно.

put_env(приложение, ключ, значение, параметры \\ [])

Устанавливает value в key для заданного app.

spec(приложение)

Возвращает описание для app.

spec(приложение, ключ)

Возвращает значение для key в описании app.

start(приложение, тип \\ :temporary)

Запускает заданное app.

started_applications(таймаут \\ 5000)

Возвращает список с информацией о работающих приложениях.

stop(приложение)

Останавливает заданное app.

unload(приложение)

Выгружает заданное app.

END_OF_DOCUMENT_MARKER

Типы

app()Source

@type app() :: atom()

application_key()Source

@type application_key() ::
  :start_phases
  | :mod
  | :applications
  | :optional_applications
  | :included_applications
  | :registered
  | :maxT
  | :maxP
  | :modules
  | :vsn
  | :id
  | :description

key()Source

@type key() :: atom()

restart_type()Source

@type restart_type() :: :permanent | :transient | :temporary

start_type()Source

@type start_type() :: :normal | {:takeover, node()} | {:failover, node()}

state()Source

@type state() :: term()

value()Source

@type value() :: term()

Обработчики

config_change(changed, new, removed)Source

@callback config_change(changed, new, removed) :: :ok
when changed: keyword(), new: keyword(), removed: [atom()]

Вызывается после обновления кода, если изменилась среда приложения.

changed — это список ключевых слов с изменёнными значениями в среде приложения. new — список ключевых слов с новыми ключами и их значениями. removed — список удалённых ключей.

prep_stop(state)Source

@callback prep_stop(state()) :: state()

Вызывается перед остановкой приложения.

Эта функция вызывается перед завершением надсмотрщика верхнего уровня. Она получает состояние, возвращённое start/2, если оно было, или [] в противном случае. Возвращаемое значение впоследствии передаётся в stop/1.

start(start_type, start_args)Source

@callback start(start_type(), start_args :: term()) ::
  {:ok, pid()} | {:ok, pid(), state()} | {:error, reason :: term()}

Вызывается при запуске приложения.

Эта функция вызывается при запуске приложения с помощью Application.start/2 (и функций на её основе, таких как Application.ensure_started/2). Эта функция должна запускать процесс верхнего уровня приложения (который должен быть верхним надсмотрщиком дерева надзора приложения, если приложение следует принципам OTP в отношении надзора).

start_type определяет, как запускается приложение:

  • :normal — используется, если запуск является нормальным запуском или если приложение распределено и запущено на текущем узле из-за переключения с другого узла, и ключ спецификации приложения :start_phases имеет значение :undefined.
  • {:takeover, node} — используется, если приложение распределено и запущено на текущем узле из-за переключения на узле node.
  • {:failover, node} — используется, если приложение распределено и запущено на текущем узле из-за переключения на узле node, а ключ спецификации приложения :start_phases не равен :undefined.

start_args — это аргументы, передаваемые приложению в ключе спецификации :mod (например, mod: {MyApp, [:my_args]}).

Эта функция должна возвращать {:ok, pid} или {:ok, pid, state} в случае успешного запуска. state — это PID верхнего надсмотрщика. state может быть произвольным значением, и если оно опущено, по умолчанию будет []; если приложение позже будет остановлено, state передаётся обработчику stop/1 (см. документацию для обработчика stop/1 для получения дополнительной информации).

use Application не предоставляет реализацию по умолчанию для обработчика start/2.

start_phase(phase, start_type, phase_args)Source

@callback start_phase(phase :: term(), start_type(), phase_args :: term()) ::
  :ok | {:error, reason :: term()}

Запускает приложение в синхронных фазах.

Эта функция вызывается после завершения start/2, но перед возвратом Application.start/2. Она будет вызываться один раз для каждой фазы запуска, определённой в спецификации приложения (и всех включенных приложений), в порядке их перечисления.

stop(state)Source

@callback stop(state()) :: term()

Вызывается после остановки приложения.

Эта функция вызывается после остановки приложения, то есть после остановки его дерева надзора. Она должна сделать обратное тому, что делал обработчик start/2, и выполнить необходимые действия по очистке. Возвращаемое значение этого обработчика игнорируется.

state — это состояние, возвращённое start/2, если оно было, или [] в противном случае. Если присутствует необязательный обработчик prep_stop/1, то state — это его возвращаемое значение.

use Application определяет реализацию по умолчанию этой функции, которая ничего не делает и просто возвращает :ok.

END_OF_DOCUMENT_MARKER

Функции

app_dir(app)Исходный код

@spec app_dir(app()) :: String.t()

Возвращает директорию приложения.

Эта информация возвращается на основе пути кода. Вот пример:

File.mkdir_p!("foo/ebin")
Code.prepend_path("foo/ebin")
Application.app_dir(:foo)
#=> "foo"

Даже если директория пуста и нет файла .app, она считается директорией приложения на основе имени «foo/ebin». Имя может содержать дефис -, который считается версией приложения, и он удаляется для целей поиска:

File.mkdir_p!("bar-123/ebin")
Code.prepend_path("bar-123/ebin")
Application.app_dir(:bar)
#=> "bar-123"

Для получения дополнительной информации о путях кода, обратитесь к модулю Code в Elixir и модулю :code в Erlang.

app_dir(app, path)Исходный код

@spec app_dir(app(), String.t() | [String.t()]) :: String.t()

Возвращает указанный путь внутри app_dir/1.

Если path является строкой, она будет использоваться как путь внутри app_dir/1. Если path является списком строк, он будет объединён (см. Path.join/1), и результат будет использован как путь внутри app_dir/1.

Примеры

File.mkdir_p!("foo/ebin")
Code.prepend_path("foo/ebin")

Application.app_dir(:foo, "my_path")
#=> "foo/my_path"

Application.app_dir(:foo, ["my", "nested", "path"])
#=> "foo/my/nested/path"

compile_env!(app, key_or_path)Исходный код

@spec compile_env!(app(), key() | list()) :: value()

Считывает среду приложения во время компиляции или вызывает исключение.

Это то же самое, что и compile_env/3, но вызывает исключение ArgumentError, если конфигурация недоступна.

compile_env(app, key_or_path, default \\ nil)Исходный код

@spec compile_env(app(), key() | list(), value()) :: value()

Считывает среду приложения во время компиляции.

Аналогично get_env/3, но должно использоваться для чтения значений во время компиляции. Это позволяет Elixir отслеживать изменения значений конфигурации между временем компиляции и временем выполнения.

Первый аргумент — имя приложения. Второй аргумент key_or_path — это атомное ключевое слово или путь для обхода при поиске конфигурации, начиная с атомного ключевого слова.

Например, рассмотрим следующую конфигурацию:

config :my_app, :key, [foo: [bar: :baz]]

Мы можем получить доступ к ней во время компиляции следующим образом:

Application.compile_env(:my_app, :key)
#=> [foo: [bar: :baz]]

Application.compile_env(:my_app, [:key, :foo])
#=> [bar: :baz]

Application.compile_env(:my_app, [:key, :foo, :bar])
#=> :baz

Значение по умолчанию также может быть задано как третий аргумент. Если какой-либо из ключей на пути отсутствует, используется значение по умолчанию:

Application.compile_env(:my_app, [:unknown, :foo, :bar], :default)
#=> :default

Application.compile_env(:my_app, [:key, :unknown, :bar], :default)
#=> :default

Application.compile_env(:my_app, [:key, :foo, :unknown], :default)
#=> :default

Использование пути полезно, чтобы Elixir знал, что зависят только определённые пути в большой конфигурации.

delete_env(app, key, opts \\ [])Исходный код

@spec delete_env(app(), key(), timeout: timeout(), persistent: boolean()) :: :ok

Удаляет key из данной app среды.

Принимает те же параметры, что и put_env/4. Возвращает :ok.

ensure_all_started(app, type \\ :temporary)Исходный код

@spec ensure_all_started(app(), restart_type()) ::
  {:ok, [app()]} | {:error, {app(), term()}}

Убеждается, что данное app и его приложения запущены.

То же самое, что и start/2, но также запускает приложения, указанные в :applications файле .app, в случае, если они не были запущены ранее.

ensure_loaded(app)Исходный код

@spec ensure_loaded(app()) :: :ok | {:error, term()}

Убеждается, что данное app загружено.

То же самое, что и load/2, но возвращает :ok, если приложение уже загружено.

ensure_started(app, type \\ :temporary)Исходный код

@spec ensure_started(app(), restart_type()) :: :ok | {:error, term()}

Убеждается, что данное app запущено.

То же самое, что и start/2, но возвращает :ok, если приложение уже запущено. Это полезно в скриптах и при настройке тестов, где тестовые приложения нужно явно запускать:

:ok = Application.ensure_started(:my_test_dep)

fetch_env!(app, key)Исходный код

@spec fetch_env!(app(), key()) :: value()

Возвращает значение для key в среде приложения app.

Если параметр конфигурации не существует, вызывает ArgumentError.

Важно: если вы читаете среду приложения во время компиляции, например, внутри определения модуля, а не внутри функции, используйте compile_env!/2.

fetch_env(app, key)Исходный код

@spec fetch_env(app(), key()) :: {:ok, value()} | :error

Возвращает значение для key в среде приложения app в кортеже.

Если параметр конфигурации не существует, функция возвращает :error.

format_error(reason)Исходный код

@spec format_error(any()) :: String.t()

Форматирует причину ошибки, возвращаемую start/2, ensure_started/2, stop/1, load/1 и unload/1, возвращает строку.

get_all_env(app)Исходный код

@spec get_all_env(app()) :: [{key(), value()}]

Возвращает все пары ключ-значение для app.

get_application(module)Исходный код

@spec get_application(atom()) :: atom() | nil

Получает приложение для данного модуля.

Приложение находится путём анализа спецификаций всех загруженных приложений. Возвращает nil, если модуль не указан в спецификациях ни одного приложения.

get_env(app, key, default \\ nil)Исходный код

@spec get_env(app(), key(), value()) :: value()

Возвращает значение для key в среде приложения app.

Если параметр конфигурации не существует, функция возвращает значение default.

Важно: если вы читаете среду приложения во время компиляции, например, внутри определения модуля, а не внутри функции, используйте compile_env/3.

Важно: если вы пишете библиотеку для использования другими разработчиками, рекомендуется избегать среды приложения, так как среда приложения — это фактически глобальное хранилище. Для получения дополнительной информации, ознакомьтесь с нашими руководящими принципами для библиотек.

Примеры

get_env/3 обычно используется для чтения конфигурации ваших приложений OTP. Так как конфигурации Mix обычно используются для настройки приложений, мы будем использовать это в качестве примера.

Рассмотрим новое приложение :my_app. :my_app содержит движок базы данных, который поддерживает пул баз данных. Движку базы данных нужна конфигурация каждой из этих баз данных, и эта конфигурация предоставляется парами ключ-значение в среде :my_app.

config :my_app, Databases.RepoOne,
  # A database configuration
  ip: "localhost",
  port: 5433

config :my_app, Databases.RepoTwo,
  # Another database configuration (for the same OTP app)
  ip: "localhost",
  port: 20717

config :my_app, my_app_databases: [Databases.RepoOne, Databases.RepoTwo]

Наш движок базы данных, используемый :my_app нуждается в знании, какие базы данных существуют и каковы их конфигурации. Движок базы данных может выполнить вызов Application.get_env(:my_app, :my_app_databases, []) для получения списка баз данных (указанных именами модулей).

Затем движок может перебрать каждый репозиторий в списке и вызвать Application.get_env(:my_app, Databases.RepoOne) и так далее, чтобы получить конфигурацию каждого из них. В этом случае каждая конфигурация будет списком ключевых слов, поэтому вы можете использовать функции модуля Keyword или даже модуля Access для его обхода, например:

config = Application.get_env(:my_app, Databases.RepoOne)
config[:ip]

load(app)Source

@spec load(app()) :: :ok | {:error, term()}

Загружает указанное app.

Для загрузки файла .app должен находиться в пути загрузки. Также будут загружены все :included_applications.

Загрузка приложения не запускает его и не загружает его модули, но она загружает его среду.

loaded_applications()Source

@spec loaded_applications() :: [{app(), description :: charlist(), vsn :: charlist()}]

Возвращает список с информацией о загруженных приложениях.

put_all_env(config, opts \\ [])Source

@spec put_all_env([{app(), [{key(), value()}]}],
  timeout: timeout(),
  persistent: boolean()
) :: :ok

Устанавливает среду для нескольких приложений одновременно.

Переданная конфигурация не должна:

  • содержать одно и то же приложение более одного раза
  • содержать один и тот же ключ внутри одного и того же приложения более одного раза

В противном случае будет вызвано исключение.

Принимает те же опции, что и put_env/4. Возвращает :ok.

put_env(app, key, value, opts \\ [])Source

@spec put_env(app(), key(), value(), timeout: timeout(), persistent: boolean()) :: :ok

Устанавливает value в key для данного app.

Опции

  • :timeout - таймаут изменения (по умолчанию 5_000 миллисекунд)
  • :persistent - сохраняет заданное значение при загрузке и повторной загрузке приложения

Если put_env/4 вызывается до загрузки приложения, значения среды приложения, указанные в файле .app, перекроют ранее установленные.

Опция :persistent может быть установлена в true, когда необходимо гарантировать, что параметры, заданные этой функцией, не будут перекрыты параметрами, определенными в файле ресурса приложения при загрузке. Это означает, что постоянные значения сохранятся после загрузки приложения и при повторной загрузке приложения.

spec(app)Source

@spec spec(app()) :: [{application_key(), value()}] | nil

Возвращает спецификацию для app.

Возвращаются следующие ключи:

  • :description
  • :id
  • :vsn
  • :modules
  • :maxP
  • :maxT
  • :registered
  • :included_applications
  • :optional_applications
  • :applications
  • :mod
  • :start_phases

Обратите внимание, что среда не возвращается, так как к ней можно получить доступ через fetch_env/2. Возвращает nil если приложение не загружено.

spec(app, key)Source

@spec spec(app(), application_key()) :: value() | nil

Возвращает значение для key в спецификации app.

См. spec/1 для поддерживаемых ключей. Если заданный параметр спецификации не существует, эта функция вызовет исключение. Возвращает nil если приложение не загружено.

start(app, type \\ :temporary)Source

@spec start(app(), restart_type()) :: :ok | {:error, term()}

Запускает данное app.

Если app не загружено, приложение сначала загрузится с помощью load/1. Любое включенное приложение, определенное в ключе :included_applications файла .app, также загрузится, но не запустится.

Кроме того, все приложения, перечисленные в ключе :applications, должны быть явно запущены перед запуском этого приложения. В противном случае возвращается {:error, {:not_started, app}}, где app — имя отсутствующего приложения.

Если вы хотите автоматически загрузить и запустить все зависимости app, см. ensure_all_started/2.

Аргумент type задаёт тип приложения:

  • :permanent - если app завершается, все остальные приложения и весь узел также завершаются.

  • :transient - если app завершается с причиной :normal, она сообщается, но другие приложения не завершаются. Если транзиентное приложение завершается аномально, все остальные приложения и весь узел также завершаются.

  • :temporary - если app завершается, она сообщается, но другие приложения не завершаются (по умолчанию).

Обратите внимание, что всегда можно явно остановить приложение, вызвав stop/1. Независимо от типа приложения, другие приложения не повлияют.

Обратите также внимание, что тип :transient мало пригоден на практике, так как при завершении дерева наблюдения причина устанавливается в :shutdown, а не в :normal.

started_applications(timeout \\ 5000)Source

@spec started_applications(timeout()) :: [
  {app(), description :: charlist(), vsn :: charlist()}
]

Возвращает список с информацией о приложениях, которые в данный момент работают.

stop(app)Source

@spec stop(app()) :: :ok | {:error, term()}

Останавливает указанное app.

После остановки приложение всё ещё загружено.

unload(app)Source

@spec unload(app()) :: :ok | {:error, term()}

Выгружает указанное app.

Также будут выгружены все :included_applications. Обратите внимание, что функция не очищает модули приложения.

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.13.4/Application.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API