2015-07-06 4 views
8

Предположим, у меня есть макрос времени компиляции 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». Я не мог найти магию в процессе сборки, которая делает эту работу. Что мне не хватает?

ответ

4

Если вы полагаетесь на функцию только для макро-рая, то да, вам нужно сказать своим пользователям, чтобы добавить плагины компилятора. См. http://docs.scala-lang.org/overviews/macros/annotations.html. В упомянутых вами проектах используются только макрокоманды scala-компилятора (небедные), а не макро-аннотации.