如何在 sbt 项目中使用 sbt 插件作为库依赖项?

Posted

技术标签:

【中文标题】如何在 sbt 项目中使用 sbt 插件作为库依赖项?【英文标题】:How to use sbt plugin as a library dependency in a sbt project? 【发布时间】:2017-08-19 20:04:04 【问题描述】:

我有一个使用多项目构建的 sbt 插件项目。我想将此插件用作其他 sbt 项目的依赖项。我创建了一个插件,但是当我将此插件添加到项目时,我似乎无法正确链接依赖项。

sbt 插件

build.sbt

name := "sbt-plugin"
  sbtPlugin := true
  val commonSettings = Seq(
  organization := "com.example",
  version := "1.0",
  scalaVersion := "2.11.7", 
  javacOptions := Seq("-source", "1.8", "-target", "1.8"), 
  scalacOptions := Seq("-target:jvm-1.8", "-unchecked", "-deprecation", "-encoding", "utf8"))

  lazy val plugin = (project in file("plugin"))
  .settings(commonSettings: _*)
  .settings(
      name := "plugin"
  )

  lazy val root = (project in file("."))
                .settings(commonSettings: _*)
                .dependsOn(plugin)
                .aggregate(plugin)

sbt-plugin\plugin\src\main\scala\com\example\Hello.scala

  package com.example

  // Sample code I would like to access from another sbt project
  object Hello 
     def show = println("Hello, world!")
  

插件测试

plugin-test 是我用来测试 sbt-plugin 的一个 sbt 项目

插件测试\build.sbt

  name := """plugin-test"""

  version := "1.0"

  scalaVersion := "2.11.7"

  libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % "test"

  fork in run := true

插件测试\项目\plugins.sbt

addSbtPlugin("com.example" % "sbt-plugin" % "1.0", "0.13","2.11")

插件测试\src\main\scala\com\exam\Test.scala

  package com.exam

  object Test 
     def result = com.example.Hello.show()
  

但是当我编译插件测试项目时,它显示以下错误:

  [error] E:\Play\SBT Plugin\sbt demo1\plugin-test\src\main\scala\com\exam\Test.scala:4: object example is not a member of package com
  [error] def result = com.example.Hello.show()
  [error] one error found

我在两个项目上都执行了发布本地和插件/发布本地,并且工件正确解析。 我将 sbt-plugin 添加到 plugins.sbt 并编译了项目,但 Test.scala 无法编译并出现上述错误,好像依赖项不存在一样。

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

当您将插件指定为addSbtPlugin 时,您只是将其添加到构建环境中(即在build.sbt 中执行操作),而不是在应用程序的类路径中(在src/main/... 下的操作)。

在您的情况下,您需要将其用作常规依赖项。

【讨论】:

以上是关于如何在 sbt 项目中使用 sbt 插件作为库依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

sbt共享项目之间的依赖关系

手动检索 Ivy 依赖项作为 sbt 中的本地非托管库

sbt 插件和使用插件本身的多项目构建中的项目之间的相互依赖关系

如何将 sbteclipse 插件添加到 SBT 0.10.x

如何解决具有不同包装常春藤类型的sbt中的依赖关系?

如何通过将 sbt-plugin 用作多项目构建中的依赖项来访问它的子项目?