mix xref
Печатает информацию о перекрестных ссылках между модулями.
Эта задача автоматически повторно активируется, поэтому вы можете печатать информацию несколько раз в одном вызове Mix.
Режимы Xref
Задача xref ожидает режим в качестве первого аргумента:
mix xref MODE
Все доступные режимы обсуждаются ниже.
вызывающие CALLEE
Печатает всех вызывающих данного MODULE. Пример:
mix xref callers MyMod
граф
Печатает граф зависимостей файлов, где ребро от A до B указывает, что A (источник) зависит от B (сток).
mix xref graph --format stats
Принимаются следующие параметры:
--exclude- пути для исключения--label- отображает только отношения с заданным меткой. По умолчанию он сохраняет все метки, которые являются транзитивными. Метки — "compile", "export" и "runtime". Смотрите раздел "Типы зависимостей" ниже--only-nodes- отображает только имена узлов (без рёбер)--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 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 \\ [])
Спецификации
calls(keyword()) :: [
%{callee: {module(), atom(), arity()}, line: integer(), file: String.t()}
] Возвращает список информации обо всех вызовах функций во время выполнения в проекте.
Каждый элемент в списке — это карта со следующими ключами:
-
:callee- кортеж, содержащий модуль, функцию и арность вызова -
:line- целое число, представляющее строку, где вызывается функция -
:file- двоичный объект, представляющий файл, где вызывается функция -
:caller_module- модуль, в котором вызывается функция
Эта функция возвращает пустой список, когда используется в корне проекта umbrella, поскольку нет явного файла компиляции для извлечения информации о вызове функции. Чтобы получить вызовы функций для каждого дочернего элемента в проекте umbrella, выполните функцию в корне каждого отдельного приложения.
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/mix/1.11.2/Mix.Tasks.Xref.html