【问题标题】:Compile Time Parameter for Macro Expansion宏扩展的编译时间参数
【发布时间】:2017-08-15 15:10:37
【问题描述】:

我想编写一个注释宏,将extends <sometype> 添加到可以在编译时指定<sometype> 的特征。

如何将编译时参数传递给宏扩展?理想情况下,我想在编译器调用时指定一个命令行参数。

【问题讨论】:

    标签: scalameta


    【解决方案1】:

    宏注解无权访问传递给 scalac 的命令行标志。但是,实现此目的的一种可能方法是使用系统属性。

    例如在宏注解实现中

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

    然后将类型作为命令行选项传递

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

    同样,可以运行sbt -Dsometype=foobar compile。不过注意JVM进程需要以系统属性标志启动,所以设置scalacOptions += "-Dsometype=foobar"可能不起作用。

    【讨论】:

    • 我更新了答案,提到scalacOptions += "-Dfoobar=yyy" 可能不起作用,这与我原始答案中的注释相反
    • 你们试过javaOptions += "-Dfoobar=yyy"吗?
    • 有关相关讨论和使用 sys.props 的替代解决方法,请参阅 github.com/scalameta/scalameta/issues/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多