覆盖 SBT 插件中的映射
Overridings mappings in an SBT plugin
我正在尝试编写一个非常基本的 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
。我做错了什么?
我不太确定它是如何工作的,但是定义相同设置的插件可以相互覆盖。如果要覆盖 AutoPlugin
'X' 的设置,则必须通过覆盖 requires
:[=20= 将 'X' 添加到 AutoPlugin
的依赖项中]
override def requires = X
最基本设置的AutoPlugin
是JvmPlugin
。在我试图通过 AutoPlugin
向我的库中添加其他工件的类似情况下,将其添加到 requires
对我有所帮助。所以它也可能对你有帮助。
override def requires = JvmPlugin
否则,您可能想查看在您的构建中启用了哪些其他插件修改 mappings in (Compile, packageBin)
。
我正在尝试编写一个非常基本的 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
。我做错了什么?
我不太确定它是如何工作的,但是定义相同设置的插件可以相互覆盖。如果要覆盖 AutoPlugin
'X' 的设置,则必须通过覆盖 requires
:[=20= 将 'X' 添加到 AutoPlugin
的依赖项中]
override def requires = X
最基本设置的AutoPlugin
是JvmPlugin
。在我试图通过 AutoPlugin
向我的库中添加其他工件的类似情况下,将其添加到 requires
对我有所帮助。所以它也可能对你有帮助。
override def requires = JvmPlugin
否则,您可能想查看在您的构建中启用了哪些其他插件修改 mappings in (Compile, packageBin)
。