gpt4 book ai didi

sbt - 如何从 build.sbt 中分离任务代码

转载 作者:行者123 更新时间:2023-12-01 08:36:53 25 4
gpt4 key购买 nike

我已经为我的 sbt 项目编写了自定义任务并将其放置在 build.sbt .
但是我想将任务的代码放在单独的文件中并从 build.sbt 导入它。我创建了 mytask.sbt包含这样的内容:

lazy val myTask = taskKey[Unit]("my task")

myTask := {
//doing task
}

但我不知道如何从 build.sbt 中导入此任务所以我可以使用这样的东西:
compile <<= (compile in Compile) dependsOn myTask

我知道有插件概念,但我认为这对我的需求来说太过分了。我想要的只是分离一些代码。

最佳答案

您没有提及您使用的 sbt 版本,因此以下答案基于 0.13.12 版本。

据我所知,任务必须在 sbt 文件、插件或扩展 Build trait 的 scala 文件对象中定义。
我认为不可能在一个 sbt 文件中定义任何内容,并在另一个文件中使用它,所以从我的角度来看,您有以下选择:

扩展构建特性
这种做事方式在 sbt 的后续版本中已被弃用,所以我不会深入讨论。

在 Scala 文件中定义任务的逻辑。
您可以拆分任务的声明和逻辑,以便在 sbt 构建文件中声明任务,但将其逻辑移动到 scala 文件中。那么你的构建文件可能是这样的:

import CommonBuildCode._

val myTask = taskKey[Unit]("my task")

myTask := {
myTaskPerform()
}


compile := {
myTask.value
(compile in Compile).value
}

你的任务逻辑可能在文件 project/CommonBuildCode.scala 中
import sbt._

object CommonBuildCode {

def myTaskPerform(): Unit = {
println("-------------------------- myTask called --------------------------")
}
}

我不知道这对您来说是否足够,但它会将 build.sbt 文件中与 myTask 任务相关的行数保持在最低限度。

创建一个简单的插件
使用 sbt 创建插件非常容易,这将提供非常接近您要求的结果。首先像这样创建文件 project/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------------------")
}
)
}

启用项目后,autoImport 项目下的任何内容都将自动导入并可在您的 sbt 构建文件中使用,并且将应用在 projectSettings 方法中设置的所有设置。所以现在你在 build.sbt 文件中唯一需要做的就是激活插件:
enablePlugins(MyTaskPlugin)

compile := {
myTask.value
(compile in Compile).value
}

使用插件的一个额外好处是,可以很容易地将插件重构到自己的项目中,在那里它可以发布一个 jar,其他项目可以轻松激活它。这可能非常方便,以防 myTask 成为您项目中的常见构建任务。

关于sbt - 如何从 build.sbt 中分离任务代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39693041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com