Порядок компиляции файлов в проекте Scala

#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 или плагин компилятора, вам придется сначала скомпилировать файлы.