在sbt中同一个项目下添加插件

las*_*and 3 scala sbt

我正在尝试构建一个由多个项目聚合的 Scala 项目,其中之一是 sbt 插件。我想在同一父项目下的另一个子项目中使用这个插件,但我不太明白如何做到这一点。

我的项目根目录中的“build.sbt”是这样的:

lazy val plugin = project
  .in(file("sbt-Something"))
  .dependsOn(lib)
  .settings(common: _*)
  .settings(name := "My plugin",
    sbtPlugin := true)

lazy val examples = project
  .in(file("examples"))
  .dependsOn(lib, plugin)
  .settings(common: _*)
  .settings(name := "Examples")
Run Code Online (Sandbox Code Playgroud)

如何将plugin作为插件添加到项目中examples

lpi*_*ora 5

我认为您不能在使用它的项目的同一“级别”上拥有一个插件。

如果您想到的话,该插件必须在使用它的项目编译之前可用。这是因为它可能会修改构建设置,这会影响项目的构建方式。

如果您想将插件保留在项目中,可以通过在project/project目录中声明项目来实现。

$YOUR_PROJECT_ROOT/project/build.sbt

lazy val plugin = project
  .in(file("sbt-plugin"))
  .dependsOn(lib)
  .settings(name := "My plugin", sbtPlugin := true)

lazy val lib = project.in(file("lib"))

lazy val root = project.in(file(".")).dependsOn(plugin)
Run Code Online (Sandbox Code Playgroud)

然后,您可以将代码放入sbt-plugin目录,并将共享库代码放入lib文件夹。

在正常构建中,您可以引用共享库和插件。

$YOUR_PROJECT_ROOT/build.sbt

val lib = ProjectRef(file("project/lib"), "lib")

val root = project.in(file(".")).dependsOn(lib).enablePlugins(MyPlugin)
Run Code Online (Sandbox Code Playgroud)

请注意,也许将共享库作为一个单独的项目更好,因为我认为这个设置可能有点棘手。例如,如果您更改共享库中的某些内容,主项目应重新编译并应使用新代码。reload然而,该插件仅在对项目发出命令后才会使用新代码。

如果您想在项目之间共享设置,您可以检查如何在project/plugins.sbt和project/Build.scala之间共享版本值的答案?

  • 这对我来说太有帮助了。在个人项目中,我使用此技巧制作了一个由项目本身使用的插件模块(以提供资源生成器),并与其余部分一起作为工件发布(最终)。具体参见 [michaelahlers/faker-scala/tree/v0.1.x/modules/plugins](https://github.com/michaelahlers/faker-scala/tree/v0.1.x/modules/plugins)例子。 (2认同)