我有一个特殊的任务,我想在构建过程中自动化,但我在语法阶段与sbt一起陷入困境。我正在尝试使用两个本地项目执行helloworld-ish任务,一个是插件,另一个是使用该插件的测试,但是我无法在插件(sampleIntTask
)中获得新任务。在测试项目中使用sbt。
我在文件系统中有以下内容:
/plugin/
Plugin.scala
build.sbt
/test-using-plugin/
build.sbt
/project/plugins.sbt
我的helloworld-ish插件:Plugin.scala
:
import sbt._
import Keys._
object MyPlugin extends Plugin {
val sampleIntTask = taskKey[Int]("sum 1 and 2")
sampleIntTask := {
val sum = 1 + 2
println("sum: " + sum)
sum
}
}
plugin/build.sbt
中的:
sbtPlugin := true
name := "myPlugin"
version := "0.1"
scalaVersion := "2.10.3"
并测试它:在test-using-plugin/build.sbt
:
name := "test-test-test"
version := "0.1"
scalaVersion := "2.10.3"
和test-using-plugin/project/plugins.sbt
:
lazy val root = project.in( file(".") ).dependsOn( testPlugin )
lazy val testPlugin = file("/Users/cap10/gitprojects/processing")
当我/test-project$ sbt sampleIntTask
时,我得到:
[info] Set current project to test-using-plugin (in build ...)
> sampleIntTask
[error] Not a valid command: sampleIntTask
[error] Not a valid project ID: sampleIntTask
[error] Expected ':' (if selecting a configuration)
[error] Not a valid key: sampleIntTask (similar: compileInputs)
[error] sampleIntTask
[error] ^
我觉得这是关于这个测试的正确级别的复杂性(定义插件项目配置,定义插件项目行为,定义测试项目配置,添加对插件项目的依赖),但我不会惊讶,如果我是完全取决于语法,因为我无法做出sbt介绍的正面或反面。
答案 0 :(得分:3)
如果您不需要跨多个版本共享设置,只需将设置添加到test-using-plugin/custom.sbt
:
val sampleIntTask = taskKey[Int]("sum 1 and 2")
sampleIntTask := {
val sum = 1 + 2
println("sum: " + sum)
sum
}
忘了插件。
我没有测试其他部分,但您的Plugin.scala
错了。
设置表达式需要在设置顺序中:
import sbt._
import Keys._
object MyPlugin extends Plugin {
val sampleIntTask = taskKey[Int]("sum 1 and 2")
lazy val baseMyPluginSettings: Seq[sbt.Def.Setting[_]] = Seq(
sampleIntTask := {
val sum = 1 + 2
println("sum: " + sum)
sum
}
)
lazy val myPluginSettings: Seq[sbt.Def.Setting[_]] = baseMyPluginSettings
}
在test-using-plugin/build.sbt
添加:
myPluginSettings
如果必须跨构建共享设置,可以创建这样的插件或将它们放在全局sbt文件中。全局sbt的使用应限于用户特定的设置和命令,因此这样做。就个人而言,我会使用publishLocal
在本地发布插件,因此它不依赖于特定的文件路径。您可以像使用任何其他插件一样使用本地发布的插件:
addSbtPlugin("com.example" % "myPlugin" % "0.1" changing())
使用“-SNAPSHOT”版本或致电changing()
,sbt将检查最新版本。