Поэтому весь день я боролся за то, чтобы заставить какую-то сборку Gradle работать для многоплатформенного проекта Kotlin, который включает грамматику ANTLR. Я пытаюсь создать синтаксический анализатор, сгенерированный ANTLR из общей грамматики для цели Kotlin (или Java, если это не работает) и цели JavaScript. Исходя из этого, я хотел бы написать библиотеку вокруг парсера, которую можно использовать из JVM и JavaScript.
Итак, я создал многоплатформенный проект Kotlin, потому что это выглядело как хороший способ убить двух зайцев одним выстрелом (здесь репо https://github.com/derkork/project.txt). Я создал исходный набор commonAntlr
, где поместил файл грамматики в commonAntlr/antlr/project_txt.g4
. В соответствии с документацией плагина ANTLR, это то, как все должно быть настроено. Я также применяю плагин antlr
вверху (здесь это build.gradle.kts
- https://github.com/derkork/project.txt/blob/master/build.gradle.kts).
Теперь я запускаю gradle build
в надежде, что плагин ANTLR, по крайней мере, попытается сгенерировать для меня какой-нибудь хороший Java код из грамматики, используя настройки по умолчанию. Увы, это не так. Плагин ANTLR даже не запускается, что я могу сказать из вывода. Позднее сборка завершается с некоторой непонятной проблемой JavaScript, но это выглядит несвязанной, и я бы хотел пока пропустить ее.
Теперь мой Gradle-foo не совсем силен (я использовал только его в чрезвычайно простых проектах большая часть моего опыта - в Maven), и у меня есть отчетливое ощущение, что я что-то здесь упускаю. Однако документация плагина просто говорит:
Чтобы использовать плагин ANTLR, включите в ваш скрипт сборки следующее:
plugins {antlr}
Что я и сделал. Поскольку я получаю нулевой результат, у меня есть ощущение, что мне нужно сделать немного больше, чтобы это работало. Я прочитал большую часть документации Gradle вверх и вниз, чтобы узнать, как плагины работают в целом, и я обнаружил, что они добавляют задачи в сборку, а также добавляют некоторые зависимости, так что задачи вызываются, когда вы пытаетесь построить определенные вещи. Однако я не совсем понимаю, как плагины работают вместе с исходными наборами и как вы можете сказать Gradle «не могли бы вы выполнить задачу generateGrammarSource
для этого исходного набора» (или даже если она работает так).
Так что, если бы некоторые из богов Градл могли просветить меня в этом, это было бы очень ценно:)