我已经为我的sbt项目编写了自定义任务并将其放入build.sbt.但是,我想将任务的代码放在单独的文件中,并从build.sbt导入它.我创建mytask.sbt了包含这样的东西:
lazy val myTask = taskKey[Unit]("my task")
myTask := {
//doing task
}
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何从内部导入这个任务build.sbt所以我可以使用这样的东西:
compile <<= (compile in Compile) dependsOn myTask
Run Code Online (Sandbox Code Playgroud)
我知道有插件概念,但我认为这对我的需求来说太过分了.我想要的只是分开一些代码.
您没有提到您正在使用的sbt版本,因此以下答案基于版本0.13.12.
据我所知,任务必须在sbt文件,插件或扩展Build trait的scala文件对象中定义.我不认为它可能在一个sbt文件中定义任何东西,并在另一个sbt文件中使用它,所以从我的角度来看,你有这些选项:
以 这种方式扩展Build特性,在sbt的更高版本中已经被弃用了,所以我不会进入那个.
在scala文件中定义任务的逻辑. 您可以将声明和任务逻辑分开,以便在sbt构建文件中声明任务,但将其逻辑移动到scala文件中.那么你的构建文件可能是这样的:
import CommonBuildCode._
val myTask = taskKey[Unit]("my task")
myTask := {
myTaskPerform()
}
compile := {
myTask.value
(compile in Compile).value
}
Run Code Online (Sandbox Code Playgroud)
而你的任务逻辑可能在文件项目/ CommonBuildCode.scala中
import sbt._
object CommonBuildCode {
def myTaskPerform(): Unit = {
println("-------------------------- myTask called --------------------------")
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道这对你来说已经足够了,但是它会将你的build.sbt文件中关于myTask任务的行数保持在最低限度.
创建一个简单 的插件使用sbt创建插件非常容易,这样可以得到非常接近你要求的结果.首先像这样创建文件项目/ MyTaskPlugin.scala:
import sbt._
object MyTaskPlugin extends AutoPlugin {
object autoImport {
val myTask = taskKey[Unit]("my task")
}
import autoImport._
override def projectSettings = Seq(
myTask := {
println("--------------- myTask called from a plugin------------------")
}
)
}
Run Code Online (Sandbox Code Playgroud)
启用项目后,autoImport项目下的任何内容都将自动导入并可在sbt构建文件中使用,并且将应用projectSettings方法中设置的所有设置.所以现在你在build.sbt文件中唯一需要做的就是激活插件:
enablePlugins(MyTaskPlugin)
compile := {
myTask.value
(compile in Compile).value
}
Run Code Online (Sandbox Code Playgroud)
使用插件的另一个好处是,将插件重构到自己的项目中非常容易,它可以发布一个jar,可以很容易地被其他项目激活.如果myTask被证明是您项目中的常见构建任务,那么这可能非常方便.
| 归档时间: |
|
| 查看次数: |
755 次 |
| 最近记录: |