我希望我的用户能够在他们的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源代码中的设置。
答案 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,有一个新的自动插件功能可以启用 插件自动,安全地确保其设置和 依赖项是在一个项目上。