Предположим, у меня есть макрос времени компиляции Scala, который я нахожу полезным и хотел бы поделиться им (я делаю). Как создать файл JAR, который при загрузке в другой проект выполнил бы макрос при компиляции нового проекта?Как распределить макрос Scala в качестве проекта?
В частности, я сделал StaticAnnotation
, который переписывает AST класса, который он обматывает перед компиляцией. Это работает в моей Maven сборки (макрос, определенный в каталоге main
, работает на тестовых примерах в каталоге test
), потому что у меня есть
<compilerPlugins>
<compilerPlugin>
<groupId>org.scalamacros</groupId>
<artifactId>paradise_2.10.5</artifactId>
<version>2.1.0-M5</version>
</compilerPlugin>
</compilerPlugins>
в моем scala-maven-plugin
. (Я начинаю с проекта Scala 2.10, и если он будет работать, будет предоставлен как 2.10, так и 2.11.)
Но если я поместил полученный JAR в пул классов консоли Scala, сценарий Scala или в другой проект Maven (без специальных плагинов компилятора), он просто игнорирует макрос: AST не перезаписывается, и мои команды компиляции println
не выполняются. Если я использую аннотацию @compileTimeOnly
на моем макросе (новый в Scala 2.11), то он жалуется на сообщение об ошибке @compileTimeOnly
.
Нужно ли мне, чтобы мои пользователи добавляли плагины компилятора в свои файлы pom.xml
, а также альтернативные инструкции для SBT и других инструментов сборки? Другие пакеты, содержащие макросы (MacWire, Log4s), не сопровождаются сложными инструкциями по сборке: они просто говорят: «Укажите на эту зависимость в Maven Central». Я не мог найти магию в процессе сборки, которая делает эту работу. Что мне не хватает?