如何将任务依赖项从另一个插件添加到我的 SBT 插件?

Posted

技术标签:

【中文标题】如何将任务依赖项从另一个插件添加到我的 SBT 插件?【英文标题】:How can I add a Task dependency on a task from another plugin to my SBT plugin? 【发布时间】:2021-04-09 14:30:18 【问题描述】:

我正在为 SBT 编写一个插件,它将生成从 Scala 程序创建 Azure 函数所需的配置文件。我的工作在 github (https://github.com/code-star/sbt-azure-functions-plugin/tree/develop) 上,并且可以在自述文件中阅读,我想在用户发出 sbt azfunCreateZipFile 时自动触发 assembly 任务。

我的插件的用户,可以通过将以下行添加到他们的build.sbt

azfunCreateZipFile := (azfunCreateZipFile dependsOn assembly).value

我希望该任务连接已包含在我的插件定义中。我该怎么做?

我知道通过在任务定义中使用otherTask.value 可以使任务依赖于其他任务,所以我尝试在azfunCreateZipFile 任务定义中添加这样一行(参见./plugin/src/main/scala/sbtazurefunctions/AzureFunctions.scala):

azfunGenerateFunctionJsons := 
  // depend on assembly step
  val _ = assembly.value
  ... <actual task definition code>
  azfunTargetFolder.value

然后我得到一个错误,即找不到程序集:

[IJ]sbt:root> compile
[info] Compiling 1 Scala source to /home/jml/work/scala/azure/sbt-azure-functions- plugin/plugin/target/scala-2.12/sbt-1.0/classes ...
[error] /home/jml/work/scala/azure/sbt-azure-functions-plugin/plugin/src/main/scala/sbtazurefunctions/AzureFunctions.scala:113:15: not found: value assembly
[error]       val _ = assembly.value
[error]               ^
[error] one error found
[error] (plugin / Compile / compileIncremental) Compilation failed
[error] Total time: 1 s, completed Jan 3, 2021, 4:41:56 PM
[IJ]sbt:root> 

我尝试了很多导入,但没有一个成功:

import sbtassembly.AssemblyPlugin._ (and variations using AssemblyKeys and the AutoImport object)
import sbt.Keys._

我能做些什么来解决这个问题?

【问题讨论】:

【参考方案1】:

另一个 SO 答案 (How can I use an sbt plugin as a dependency in a multi-project build?) 终于让我走上了正轨,因为它显示了 libraryDependencies += Defaults.sbtPluginExtra 的使用,所以感谢 @michael-zajac。

我最终添加了这样的程序集依赖项:

lazy val plugin = (project in file("plugin"))
  .enablePlugins(SbtPlugin)
  .settings(
    ...<other settings>...,
    libraryDependencies ++= Seq(
      "org.scala-sbt" %% "scripted-plugin" % sbtVersion.value,
      Defaults.sbtPluginExtra("com.eed3si9n" % "sbt-assembly" % "0.14.10", "1.0", "2.12")
    ),
    ...

更好:

    libraryDependencies ++= Seq(
      "org.scala-sbt" %% "scripted-plugin" % sbtVersion.value
    ),
    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.10"),

【讨论】:

以上是关于如何将任务依赖项从另一个插件添加到我的 SBT 插件?的主要内容,如果未能解决你的问题,请参考以下文章

将文件从 sbt 插件复制到项目文件夹

如何使用 SBT 将 MATSim 添加到我的 Scala 项目中?

SBT 插件:如何将编译器插件添加为不向下游传播的依赖项?

如何将 sbteclipse 插件添加到 SBT 0.10.x

如何将插件作为库添加到我制作的插件中?

使 SBT 子项目任务依赖于另一个子项目任务