覆盖 SBT 插件中的映射

Posted

技术标签:

【中文标题】覆盖 SBT 插件中的映射【英文标题】:Overridings mappings in an SBT plugin 【发布时间】:2018-09-01 23:44:50 【问题描述】:

我正在尝试编写一个非常基本的 SBT 插件来发布和使用仅源代码包,以将节俭的 IDL 文件传递​​给其他想要调用我的 API 的服务。为什么说来话长,但这个问题是关于 SBT 而不是节俭。

当我在build.sbt 中编写以下内容时,按预期工作(只有src/main 下的文件包含在 jar 中:

name := "test-dep2"

scalaVersion := "2.12.5"

lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      organization := "com.example",
      scalaVersion := "2.12.4",
      version      := "0.1.1-SNAPSHOT")),
    name := "test-dep2",
    mappings in (Compile, packageBin) := 
      (sourceDirectory.value / "main" ** "*.*").get. map  file =>
        (file, file.relativeTo(baseDirectory.value).get.toString )
      
    
 )

但下面的build.sbt 不起作用(即,jar 包含已编译的类,正常):

name := "test-dep2"

scalaVersion := "2.12.5"

lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      organization := "com.example",
      scalaVersion := "2.12.4",
      version      := "0.1.1-SNAPSHOT")),
    name := "test-dep2"
  ).enablePlugins(com.example.sbt.MyPlugin)

这是MyPlugin

package com.example

import sbt.Keys._
import sbt._

object MyPlugin extends AutoPlugin 

  object autoImport 
    val someTask = taskKey[Unit]("Some task")
  

  import autoImport._

  val sbtSourceSettings: Seq[Setting[_]] = Seq(
    someTask := 
      println("I'm doing something!")
    ,
    mappings in (Compile, packageBin) := 
      (sourceDirectory.value / "main" ** "*.*").get. map  file =>
        (file, file.relativeTo(baseDirectory.value).get.toString )
    
  )

  override lazy val projectSettings: Seq[Def.Setting[_]] = sbtSourceSettings

插件通过project/plugins.sbt添加到项目中,包含以下内容:

lazy val root = (project in file(".")).dependsOn(assemblyPlugin)

lazy val assemblyPlugin = RootProject(uri("file:///home/tjarvstrand/src/sbt-source-only-dependency"))

我知道插件已加载,因为我可以运行 sbt root/someTask 并打印 I'm doing something。我做错了什么?

【问题讨论】:

当您说“不起作用”时,您的意思是它加载时没有错误,但映射没有被覆盖?如果您有任何错误,请在此处发布。另外,您将插件代码保存在哪里? 你试过override def projectSettings吗? 我不确定,但这可能是 sbt 应用自动插件的顺序。尝试在您的AutoPlugin 中添加override def requires = JvmPlugin。这在类似情况下对我有用。 谢谢!我已经用你的问题的答案更新了我的问题。 @SaschaKolberg 你的建议奏效了!请给它作为答案,我会选择它作为正确的! 【参考方案1】:

我不确定它是如何工作的,但是定义相同设置的插件可以相互覆盖。如果您想覆盖 AutoPlugin 'X' 的设置,您必须通过覆盖 requires 将 'X' 添加到 AutoPlugin 的依赖项中:

override def requires = X

具有最基本设置的AutoPluginJvmPlugin。将此添加到requires 帮助我解决了类似的情况,我尝试通过AutoPlugin 向我的库中添加其他工件。所以它也可能对你有所帮助。

override def requires = JvmPlugin

否则,您可能想查看在您的构建中启用了哪些其他插件修改mappings in (Compile, packageBin)

【讨论】:

以上是关于覆盖 SBT 插件中的映射的主要内容,如果未能解决你的问题,请参考以下文章

SBT:多构建依赖/聚合项目中的覆盖设置

覆盖 sbt 中的传递依赖版本 [重复]

SBT 中的排序和覆盖任务

如何在具有多个子项目的 SBT 项目中覆盖子项目中的设置

SBT插件——编译前执行自定义任务

Playframework:无法覆盖 sbt 依赖项