#scala #compilation #dependencies #topological-sort
#scala #Сборник #Зависимости #топологическая сортировка
Вопрос:
Привет, я пытаюсь определить и сгенерировать порядок компиляции файлов в моем проекте scala, зависимости между файлами или топологический граф моих исходных файлов? Как я могу это сделать?
Комментарии:
1. Зачем вам это нужно? Обычно не предполагается полагаться на порядок компиляции файлов. Обычно порядка компиляции подпроектов достаточно.
2. Предположим, у вас есть файл
A.scala
с содержимымclass A { new B }
и файлB.scala
с содержимымclass B { new A }
. Какой порядок компиляции вы ожидаете?3. Я не ожидаю порядка, подойдет циклический граф. Или нециклический с предполагаемым порядком.
Ответ №1:
Вам нужно скомпилировать все файлы, которые могут иметь зависимости между ними, вместе: чтобы выяснить, какой файл зависит от чего, вам нужно знать, на какие символы ссылается файл, и какие символы находятся в каждом файле. Для выполнения этих действий вам необходимо скомпилировать файлы.
Другими словами, вы не будете знать, что находится в файле, пока не скомпилируете его, и вы не будете знать, можете ли вы скомпилировать его независимо, пока не узнаете, что в нем.
Для инкрементной компиляции для каждого файла вам нужно сохранить, какие символы определены в каком файле, затем, если файл редактируется и перекомпилируется, вам нужно рекурсивно перекомпилировать все файлы, которые ссылались на символы в файле.
Комментарии:
1. Согласно тому, что вы говорите, есть ли способ создать граф зависимостей для компиляции одного исходного файла?
2. @PheniXTylor Например, вы можете использовать Scalameta для анализа ваших исходных файлов и анализа деревьев ваших программ. Если вы включите SemanticDB , вы сможете увидеть, какие символы используются в каких местах.
3. Я понимаю, что вы говорите, я начал это делать, но кто-то, должно быть, уже сделал это, я полагаю, вы знаете такой проект?
4. Без scalameta вы могли бы посмотреть на плагин ациклического компилятора: github.com/lihaoyi/acyclic — независимо от того, используете ли вы SemanticDB или плагин компилятора, вам придется сначала скомпилировать файлы.