如何定义自定义构建设置?

时间:2014-08-09 01:31:46

标签: scala sbt

我希望我的用户能够在他们的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源代码中的设置。

1 个答案:

答案 0 :(得分: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

鉴于OP问the comment

  

我现在如何在项目代码中引用它?我希望能够   在我的一个.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个文件中,因此访问val会变得简单。要获得项目中可用的设置(单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依赖。 / p>

您可能想了解sbt 0.13.5的新功能 - auto plugins - 这可以更轻松地设置您的插件:

  

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