通过sbt插件添加库依赖项 - 每个子项目

mat*_*ter 7 sbt scalac

我试图通过sbt插件添加库依赖项.应该根据每个子项目的二进制scala版本将依赖项添加到每个子项目中,因此我遍历每个子项目.

  private def inject(): State => State = { state =>
    val extracted: Extracted = Project.extract(state)

    val enrichedLibDepSettings = extracted.structure.allProjectRefs map { projRef =>

      val projectScalaVersion = (scalaBinaryVersion in projRef)

      libraryDependencies in projRef += 
        compilerPluginOrg % (compilerPluginArtifact + "_" + projectScalaVersion.value) % compilerPluginVersion % "provided"
    }

    val newState = extracted.append(enrichedLibDepSettings, state)

    val updateAfterLibAppend = extracted.structure.allProjectRefs map { projRef => 
      println("running update: " + EvaluateTask(extracted.structure, update, newState, projRef)) }
      state
  }
Run Code Online (Sandbox Code Playgroud)

但是这不起作用 - 打印输出显示没有附加的库依赖关系的痕迹libraryDependencies in projRef +=,也没有发出任何错误,留下后续步骤来故障转移缺少的依赖项.这种技术可能有什么问题?

您会问为什么首先需要这个?为什么通过像这样的sbt插件添加库依赖?

虽然我们在SBT addCompilerPlugin,它不能用于具有参数(编译器插件-Xplugin有一个罐子的路径必须指定scalac,它接受的编译器插件参数,至于实验所示).因此,我们需要在将-Xplugin其解析为库依赖项之后注入编译器插件(然后调整其文件路径位置以检查结果update).因此我们需要通过sbt插件添加库依赖项.我们还需要为每个子项目执行此操作,因为多项目构建可能包含不同scala版本的子项目 - 每个项目都必须注入二进制兼容的编译器插件,以保持二进制兼容性.

顺便说一句,这可能照亮我的东西在黑暗中过我:当添加库相关的projectSettings覆盖根项目-如下-的依赖似乎解决,但这是没用的,因为它会采用同样的二进制版本到所有子项目,这违背了手头任务的性质(一些子项目自然会崩溃二进制不兼容).另外我认为它将覆盖root的设置,而这里的目标是附加一个不覆盖现有设置的设置.

object Plugin extends AutoPlugin {
  override lazy val projectSettings = Seq(
    ...
}
Run Code Online (Sandbox Code Playgroud)

一对线索?

  1. 每个子项目附加scalacOptions - 使用相同的技术 - 只是起作用.

  2. 施加+=libraryDepenencies上面,甚至不影响的输出inspect libraryDependencies,采用了一个内部的相同成语时不同override lazy val projectSettings的块AutoPlugin.

fom*_*mil 4

我想你可能对什么projectSettings是感到困惑。如果扩展AutoPlugin,您可以定义每个项目应用的默认设置(在默认值之上),请参阅https://github.com/sbt/sbt/blob/v0.13.9/main/src/main/scala /sbt/Plugins.scala#L81

这意味着您可以使用典型的Setting/Task符号简单地在此处添加您的工件,例如

def projectSettings = Seq(
  libraryDependencies += {
    val bin = scalaBinaryVersion.value
    ...
  }
)
Run Code Online (Sandbox Code Playgroud)

注意,这是+=,不是:=。这有帮助吗?