如何在 sbt-plugin 中使用 sbt-assembly?

Posted

技术标签:

【中文标题】如何在 sbt-plugin 中使用 sbt-assembly?【英文标题】:How to use sbt-assembly in sbt-plugin? 【发布时间】:2018-12-11 09:10:07 【问题描述】:

我正在编写一个 sbt 插件来抽象出一些样板。 我们就叫它sbt-redux

那么还有一个插件sbt-assembly

在这个任务中,我的插件(sbt-redux)需要知道项目(使用 sbt-redux 的项目)将使用 sbt-assembly 创建 Uber jar 的位置以及 jar 的名称。 我尝试在 sbt-redux 的插件中添加 sbt-assembly,但由于显而易见的原因,它不会在我的 src 文件夹中添加依赖项,因为它仅在 build.sbt 中有限制。

我尝试使用.dependsOn(assembly),但仍然没有成功。

那么,我怎样才能在 src 中使用其他插件呢?

附:如果问题不清楚,请告诉我。

【问题讨论】:

您好,和您遇到同样的问题,但是当我尝试您的建议时,无法识别 sbtassembly 包。:not found: value sbtassembly override def requires = super.requires && sbtassembly.AssemblyPlugin 发现我做错了什么,在下面发布了一个澄清作为原始答案的补充。 addSbtPlugin 行需要放在.settings() 内。 【参考方案1】:

在那里我找到了一个解决方案,它对我有用。 如果你想阅读程序集的设置,你必须确保你的插件依赖它。在您的 build.sbt 文件中,您可以添加:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.7").

然后在您的 AutoPlugin 实现中,您应该以这种方式覆盖需求:

override def requires = super.requires && sbtassembly.AssemblyPlugin

之后,您将可以访问装配设置和任务。

感谢 gpoirier。

【讨论】:

【参考方案2】:

为了扩展来自@arglee 的正确答案,当您有一个多模块项目时,addSbtPlugin 行需要成为需要依赖项的模块的.settings 条目的一部分,例如:

lazy val mod = (project in file("mod"))
  .settings(
    ...,
    addSbtPlugin( ... ),
    libraryDependencies ++= Seq( ... ),
    ...
  )

【讨论】:

以上是关于如何在 sbt-plugin 中使用 sbt-assembly?的主要内容,如果未能解决你的问题,请参考以下文章

超时解决 sbt-plugin

SBT。解决 play sbt-plugin 的依赖关系

播放升级到 2.4 但无法获取 sbt-plugin

未解决的依赖关系:sbt-plugin;2.7.0 尝试编译播放模板项目时

如何在 sbt 项目中使用 sbt 插件作为库依赖项?

将 Play JSON 库添加到 sbt