【问题标题】:How to define a custom build setting?如何定义自定义构建设置?
【发布时间】:2014-08-12 05:26:44
【问题描述】:

我希望我的用户能够在他们的project/ 定义中定义一个值,该值将用作获取远程配置文件的 URL,而 sbt 插件将反过来使用该远程配置文件。我不知道如何定义这样的值。当我尝试将其添加到 build.sbt 时,我收到此错误:

/Users/2rs2ts/src/my-cool-plugin/build.sbt:74: error: not found: value myConfigUrl
myConfigUrl := "http://mycoolwebsite.com/config.xml"
^
[error] Type error in expression

可能是因为它不是Keys 的一部分。但我不知道我应该如何添加这样的东西。即使在那之后,我也不知道如何访问插件的 Scala 源中的设置。

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    使用settingKey 宏定义myConfigUrl 键。

    build.sbt 示例如下:

    lazy val myConfigUrl = settingKey[String]("URL for fetching a remote configuration file")
    
    myConfigUrl := "http://mycoolwebsite.com/config.xml"
    

    一个示例会话:

    ➜  my-cool-plugin  xsbt
    [info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
    [info] Set current project to my-cool-plugin (in build file:/Users/jacek/sandbox/my-cool-plugin/)
    > show myConfigUrl
    [info] http://mycoolwebsite.com/config.xml
    

    鉴于the comment OP 询问的位置:

    我现在如何在我的项目代码中引用它?我希望能够 在我的 .scala 文件之一中访问我分配给 myConfigUrl 的值, 与构建过程无关。

    该键应在build.scala 构建对象中定义,因为*.sbt 文件中的键在project/*.scala 文件中不可见。

    这是一个示例 project/build.scala 构建定义,其中包含密钥:

    import sbt._
    import Keys._
    
    object build extends Build {
      lazy val myConfigUrl = settingKey[String]("URL for fetching a remote configuration file")
    
      lazy val mySettings = inConfig(Compile) { Seq(
        myConfigUrl := "http://mycoolwebsite.com/config.xml"
      )}
    
    }
    

    使用 Scala 构建,将 build.sbt 更改为如下:

    mySettings
    

    您可以这样做,因为每个构建文件都会自动导入到 *.sbt 文件中,因此访问 vals 变得像这样简单。要使设置 - 单个 myConfigUrl 键 - 在项目中可用,您需要添加 Seq[Setting] val。

    执行reload 并且密钥应该像以前一样可用:

    > show myConfigUrl
    [info] http://mycoolwebsite.com/config.xml
    

    给定the comment

    我对让最终用户 my-cool-plugin 定义他们自己的 myConfigUrl 来代替 my-cool-plugin 的 build.sbt 中的默认值

    钥匙的意图很清楚。这是插件的关键,所以只需将sbtPlugin := true 添加到构建中,publishLocal 项目并使用addSbtPlugin 在另一个构建中声明对插件的plugin 依赖项。

    您可能想了解 sbt 0.13.5 的新功能 - auto plugins - 进一步简化您的插件设置:

    从 sbt 0.13.5 开始,有一个新的自动插件功能可以启用 插件自动、安全地确保其设置和 依赖项在一个项目上。

    【讨论】:

    • 谢谢。我现在如何在我的项目代码中引用它?我希望能够访问我在我的.scala 文件之一中分配给myConfigUrl 的值,与构建过程无关。
    • 我对一种让my-cool-plugin 的最终用户定义自己的myConfigUrl 的方法特别感兴趣,这将用于代替my-cool-pluginbuild.sbt 中的默认值。
    • 查看我对答案的更新。不过,您将不得不详细说明“与构建过程无关。” 提供更完整的答案。
    • 谢谢,我绝对需要build.scala 示例。我想通了 - 在我的 Plugin.scala 的对象中定义了设置,现在可以通过导入该对象并覆盖设置来覆盖它(如 MyCoolPlugin.settings ++ Seq( myConfigUrl := "http://myclientscoolwebsite.com/config.xml" )。)
    • 如果是关于*.sbt文件,你不需要"import that object",因为插件对象是默认导入的。使用 consoleProject 了解将包含在 *.sbt 文件中的内容 - 导入会在启动时打印出来。
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2017-03-26
    • 1970-01-01
    • 2021-07-07
    相关资源
    最近更新 更多