SBT插件中的重叠映射

时间:2018-03-23 10:14:54

标签: scala sbt sbt-plugin

我正在尝试编写一个非常基本的SBT插件来发布和使用仅源代码包,以便将thrift 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。我做错了什么?

1 个答案:

答案 0 :(得分:1)

我不确定它是如何工作的,但定义相同设置的插件可以互相覆盖。如果您要覆盖AutoPlugin' X'的设置你必须添加' X'通过覆盖AutoPlugin

来覆盖requires的依赖关系
override def requires = X

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

override def requires = JvmPlugin

否则,您可能希望查看构建中启用的其他插件修改mappings in (Compile, packageBin)