the*_*eon 2 settings configuration scala sbt sbt-plugin
我正在编写一个添加命令的SBT插件,并希望用户能够通过在其中设置变量来配置此命令build.sbt.实现这一目标的最简单方法是什么?
以下是插件外观的简化示例:
import sbt.Keys._
import sbt._
object MyPlugin extends Plugin {
override lazy val settings = Seq(commands += Command.args("mycommand", "myarg")(myCommand))
def myCommand = (state: State, args: Seq[String]) => {
//Logic for command...
state
}
}
Run Code Online (Sandbox Code Playgroud)
我希望有人能够将跟随添加到他们的build.sbt文件中:
newSetting := "light"
Run Code Online (Sandbox Code Playgroud)
如何String从myCommand上面的命令中将其作为变量提供?
看一下这里的例子:http://www.scala-sbt.org/release/docs/Extending/Plugins.html#example-plugin
在此示例中,定义了任务和设置:
val newTask = TaskKey[Unit]("new-task")
val newSetting = SettingKey[String]("new-setting")
val newSettings = Seq(
newSetting := "test",
newTask <<= newSetting map { str => println(str) }
)
Run Code Online (Sandbox Code Playgroud)
然后,您的插件的用户可以newSetting在他们的build.sbt中为该设置提供自己的值:
newSetting := "light"
Run Code Online (Sandbox Code Playgroud)
编辑
这是另一个例子,更接近你的目标:
Build.scala:
import sbt._
import Keys._
object HelloBuild extends Build {
val newSetting = SettingKey[String]("new-setting", "a new setting!")
val myTask = TaskKey[State]("my-task")
val mySettings = Seq(
newSetting := "default",
myTask <<= (state, newSetting) map { (state, newSetting) =>
println("newSetting: " + newSetting)
state
}
)
lazy val root =
Project(id = "hello",
base = file("."),
settings = Project.defaultSettings ++ mySettings)
}
Run Code Online (Sandbox Code Playgroud)
使用此配置,您可以my-task在sbt提示符下运行,并且您将看到newSetting: default打印到控制台.
您可以在build.sbt中覆盖此设置:
newSetting := "modified"
Run Code Online (Sandbox Code Playgroud)
现在,当您my-task在sbt提示符下运行时,您将看到newSetting: modified打印到控制台.
编辑2
以下是上述示例的独立版本:https://earldouglas.com/ext/stackoverflow.com/questions/17038663/
| 归档时间: |
|
| 查看次数: |
2764 次 |
| 最近记录: |