Angenommen, ich habe ein Scala-Kompilierungsmakro, das ich nützlich finde und es gerne teilen würde (tue ich). Wie erstelle ich eine JAR-Datei, die, wenn sie in ein anderes Projekt geladen wird, das Makro ausführt, wenn das neue Projekt kompiliert wird?
Insbesondere habe ich eine StaticAnnotation
erstellt, die den AST der Klasse, die vor der Kompilierzeit umbrochen wurde, umschreibt. Dies funktioniert in meinem Maven-Build (Makro, das im main
-Verzeichnis definiert ist, läuft auf Testfällen im test
-Verzeichnis), weil ich
in meinem scala-maven-plugin
. (Ich beginne mit einem Scala 2.10 Projekt und wenn es funktioniert, wird sowohl 2.10 als auch 2.11 zur Verfügung gestellt.)
Aber wenn ich das resultierende JAR auf einen Scala-Konsolen-Klassenpfad, in ein Scala-Skript oder in ein anderes Maven-Projekt (ohne spezielle Compiler-Plugins) setze, ignoriert es einfach das Makro: das AST nicht wird überschrieben und meine Kompilierungszeit println
-Anweisungen werden nicht ausgeführt. Wenn ich die @compileTimeOnly
Annotation für mein Makro verwende (neu in Scala 2.11), dann klagt es mit der @compileTimeOnly
Fehlermeldung.
Muss ich meinen Benutzern wirklich sagen, dass sie Compiler-Plugins in ihren pom.xml
-Dateien hinzufügen müssen, sowie alternative Anweisungen für SBT und andere Build-Tools? Andere Pakete mit Makros ( MacWire , Log4s ) nicht mit komplizierten Bauanleitungen kommen: sie sagen nur, "zeigen Sie auf diese Abhängigkeit in Maven Central." Ich konnte die Magie in ihrem Build-Prozess nicht finden, der das funktioniert. Was vermisse ich?
Wenn Sie sich auf eine Nur-Makro-Paradiesfunktion verlassen, dann müssen Sie Ihren Benutzern sagen, dass sie Compiler-Plugins hinzufügen müssen. Siehe Ссылка . Die von Ihnen erwähnten Projekte verwenden nur die integrierten (nicht-paradiesischen) Makrofunktionen des Scala-Compilers, keine Makro-Annotationen.