Spec-Zone.ru › Elixir 1.12

mix xref

Выводит информацию о перекрестных ссылках между модулями.

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

Режимы xref

Задача xref ожидает режим в качестве первого аргумента:

mix xref MODE

Все доступные режимы обсуждаются ниже.

callers CALLEE

Выводит всех вызывающих модулей заданного MODULE. Пример:

mix xref callers MyMod

graph

Выводит граф зависимостей файлов, где дуга от A до B указывает, что A (источник) зависит от B (приемник).

mix xref graph --format stats

Принимаются следующие опции:

  • --exclude - пути для исключения

  • --label - отображает только отношения с заданным тегом. По умолчанию сохраняются все транзитивные теги. Теги "compile", "export" и "runtime". См. раздел "Типы зависимостей" ниже

  • --only-nodes - отображает только имена узлов (без дуг). Обычно полезно с флагом --sink

  • --only-direct - опция --label будет ограничивать себя только прямыми зависимостями вместо транзитивных

  • --source - отображает все файлы, на которые ссылается данный исходный файл (прямо или косвенно)

  • --sink - отображает все файлы, которые ссылаются на данный файл (прямо или косвенно)

  • --min-cycle-size - контролирует минимальный размер цикла в форматах, таких как stats и cycles

  • --format - может быть установлено в одно из значений:

    • pretty - выводит граф в терминал с использованием символов Юникод. Каждый вывод каждого файла, за которым следуют файлы, от которых он зависит. Это значение по умолчанию, за исключением Windows;
    • plain - то же самое, что и pretty, но вместо символов Юникод используются символы ASCII. Это значение по умолчанию в Windows;
    • stats - выводит общую статистику о графе;
    • cycles - выводит все циклы в графе;
    • dot - генерирует описание графа DOT в xref_graph.dot в текущем каталоге. Предупреждение: это перезапишет любой ранее сгенерированный файл

Опции --source и --sink особенно полезны при попытке понять, как модули в конкретном файле взаимодействуют со всей системой. Вы можете комбинировать эти опции с --label и --only-nodes, чтобы получить все файлы, которые демонстрируют определенное свойство, например:

# To get all files and their direct compile time dependencies
mix xref graph --label compile --only-direct

# To get the tree that depend on lib/foo.ex at compile time
mix xref graph --label compile --sink lib/foo.ex

# To get all files that depend on lib/foo.ex at compile time
mix xref graph --label compile --sink lib/foo.ex --only-nodes

# To get all paths between two files
mix xref graph --source lib/foo.ex --sink lib/bar.ex

# To show general statistics about the graph
mix xref graph --format stats

# To limit statistics only to certain labels
mix xref graph --format stats --label compile

Понимание выводимого графика

Когда mix xref graph выполняется, он выведет дерево следующего формата:

lib/a.ex
`-- lib/b.ex (compile)
    `-- lib/c.ex

Это дерево означает, что lib/a.ex зависит от lib/b.ex на этапе компиляции, который затем зависит от lib/c.ex на этапе выполнения. Это часто проблематично, потому что если lib/c.ex изменится, lib/a.ex также потребуется перекомпиляция из-за этой косвенной зависимости на этапе компиляции.

Флаги --source или --sink не изменяют способ чтения графика. Например, если мы используем флаг --sink lib/c.ex, мы увидим то же дерево:

lib/a.ex
`-- lib/b.ex (compile)
    `-- lib/c.ex

Если флаг --label compile задан с --sink, то lib/c.ex не будет отображаться, потому что ни один модуль не имеет зависимости на этапе компиляции от lib/c.ex, но lib/a.ex все еще имеет косвенную зависимость на этапе компиляции от lib/c.ex через lib/b.ex.

lib/a.ex
`-- lib/b.ex (compile)

Поэтому использование комбинации --sink с --label полезно для поиска всех файлов, которые изменятся, когда изменится приемник, наряду с транзитивными зависимостями, которые приведут к перекомпиляции.

Типы зависимостей

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

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

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

Общие опции

Эти опции общие для всех режимов:

  • --include-siblings - включает зависимости, у которых :in_umbrella установлено в значение true в текущем проекте в отчетах. Это может быть использовано для поиска вызывающих модулей или для анализа графов между проектами

  • --no-compile - не компилирует, даже если файлы требуют компиляции

  • --no-deps-check - не проверяет зависимости

  • --no-archives-check - не проверяет архивы

  • --no-elixir-version-check - не проверяет версию Elixir из mix.exs

Сводка

Функции

calls(opts \\ []) устаревший

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

Функции

calls(opts \\ [])Источник

Данная функция устарела. Используйте инструменты отслеживания компиляции, описанные в модуле Code.

Спецификации

calls(keyword()) :: [
  %{callee: {module(), atom(), arity()}, line: integer(), file: String.t()}
]

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

Каждый элемент в списке представляет собой карту с такими ключами:

  • :callee - кортеж, содержащий модуль, функцию и арность вызова
  • :line - целое число, представляющее строку, где вызывается функция
  • :file - бинарная строка, представляющая файл, где вызывается функция
  • :caller_module - модуль, в котором вызывается функция

Эта функция возвращает пустой список, когда используется в корне проекта с несколькими приложениями, так как нет манифеста компиляции для извлечения информации о вызове функции. Чтобы получить вызовы функций каждого приложения в проекте с несколькими приложениями, выполните функцию в корне каждого отдельного приложения.

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/mix/1.12.0/Mix.Tasks.Xref.html

Spec-Zone.ru

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