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

时间:2014-07-21 11:44:49

标签: 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")

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

1 个答案:

答案 0 :(得分:1)

我认为你不能在与正在使用它的项目相同的“级别”拥有插件。

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

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

$ YOUR_PROJECT_ROOT /项目/ 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)

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

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

$ YOUR_PROJECT_ROOT / build.sbt

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

val root = project.in(file(".")).dependsOn(lib).enablePlugins(MyPlugin)

请注意,将共享库作为一个单独的项目保留可能会更好,因为我认为这种设置可能有点棘手。例如,如果您在共享库中更改某些内容,则主项目应重新编译并应使用新代码。但是,插件只会在项目上发出reload命令后使用新代码。

如果您想在项目之间共享设置,可以查看How to share version values between project/plugins.sbt and project/Build.scala?

的答案