如何通过在多项目构建中将其用作依赖项来访问 sbt 插件的子项目?



我有一个使用多项目构建的 sbt 插件项目。我想将此插件用作其他 sbt 项目的依赖项,并访问此 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 root = (project in file("."))
.settings(commonSettings: _*)
.dependsOn(plugin)
.aggregate(plugin)
lazy val plugin = (project in file("plugin"))
.settings(commonSettings: _*)
.settings(
name := "plugin" ,
mainClass in (Compile, run) := Some("com.example.Main")
)

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

package com.example
object Main {
def main(args: Array[String]){
println("Hello from plugin in sbt-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!")
}

插件测试

插件测试是一个SBT项目,我用它来测试SBT插件

plugin-test\build.sbt

name := """plugin-test"""
val commonSettings = Seq(
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"),
libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % "test"    
)
lazy val root = (project in file("."))
.settings(commonSettings: _*)
.dependsOn(pluginpro)
.aggregate(pluginpro)
.settings(
mainClass in (Compile, run) := Some("com.exam.Test")
)
lazy val pluginpro = (project in file("pluginpro"))
.settings(commonSettings: _*)
.settings(
libraryDependencies += "com.example" % "plugin_2.11" % "1.0"         
)

plugin-test\src\main\scala\com\exam\Test.scala

package com.exam
object Test {
def result = com.example.Hello.show()
}

当我从 root 运行插件测试项目时,它正在运行,但带有下面提到的日志,我不确定为什么它会显示这个,因为据我说,输出只会Hello, world!

background log: info: Running com.exam.Test
background log: debug: Waiting for threads to exit or System.exit to be called.
background log: debug: Waiting for thread run-main-0 to terminate.
background log: debug:   Classpath:
E:PlaySBT Pluginsbt demo1plugin-testtargetscala-2.11classes
E:PlaySBT Pluginsbt demo1plugin-testpluginprotargetscala-2.11classes
C:UsersJeetu.ivy2cacheorg.scala-langscala-libraryjarsscala-library-2.11.7.jar
C:UsersJeetu.ivy2localcom.exampleplugin_2.111.0jarsplugin_2.11.jar
Hello, world!
()
background log: debug:  Thread run-main-0 exited.
background log: debug: Interrupting remaining threads (should be all daemons).
background log: debug: Sandboxed run complete..
background log: debug: Exited with code 0  

当我尝试通过pluginpro/run运行sbt插件的子项目时,它找不到主类。

> pluginpro/run
[trace] Stack trace suppressed: run last pluginpro/compile:backgroundRun for the full output.
[error] (pluginpro/compile:backgroundRun) No main class detected.

我已经在SBT-plugin/plugin项目中创建了主类。 我在两个项目上都执行了本地发布和插件/发布本地,并且正确解析了工件。

我在这里错过了什么?

我通过在插件pro项目的build.sbt中添加以下内容来解决它:

mainClass in (Compile, run) := Some("com.example.Main")         

最新更新