2017-03-23 3 views
1

Ich möchte ein Anmerkungsmakro schreiben, das extends <sometype> Eigenschaften hinzufügt, in denen <sometype> zu Kompilierzeit angegeben werden kann.Kompilierzeitparameter für Makroerweiterung

Wie kann ein Kompilierzeitparameter an eine Makroerweiterung übergeben werden? Idealerweise möchte ich beim Compileraufruf ein Kommandozeilenargument angeben.

Antwort

1

Makro-Annotationen haben keinen Zugriff auf die Kommandozeilen-Flags, die an scalac übergeben werden. Eine Möglichkeit, dies zu erreichen, könnte jedoch die Verwendung von Systemeigenschaften sein.

Zum Beispiel in der Makro-Annotation Implementierung

// MyMacro.scala 
val someType = sys.props.getOrElse("myapp.sometype", ???) 

dann den Typen als Option Befehlszeile übergeben

// command-line 
scalac -Dmyapp.sometype=foobar Code.scala 

In ähnlicher Weise ist es möglich, sbt -Dsometype=foobar compile zu laufen. Beachten Sie jedoch, dass der JVM-Prozess mit dem Systemeigenschaftenflag beginnen muss, sodass die Einstellung scalacOptions += "-Dsometype=foobar" möglicherweise nicht funktioniert.

+0

Ich aktualisierte die Antwort zu erwähnen, dass 'scalacOptions + =" -Dfoobar = yyy "' möglicherweise nicht funktioniert, im Gegensatz zu einer Notiz in meiner ursprünglichen Antwort –

+0

Habt ihr versucht 'javaOptions + =" -Dfoobar = yyy "'? –

+0

Weitere Informationen finden Sie unter https://github.com/scalameta/scalameta/issues/840#issuecomment-299962849 und eine alternative Problemumgehung für die Verwendung von sys.props –

Verwandte Themen