显示当前项目的 sbt 任务的源目录以及它所依赖的项目的源目录

display source directories from sbt task for current project as well as source directories of project it dependsOn

sbt sourceDirectories

只显示当前项目的源码目录,不显示其依赖的项目的源码目录

dependsOn(ProjectRef)

下面是简化的任务。

lazy val showAllSourceDirs = taskKey[Unit]("show source directories of all projects")
showAllSourceDirs := {
  val projectRefs = loadedBuild.value.allProjectRefs.map(_._1)
  projectRefs foreach { projectRef =>

    /*
      Below line is giving IllegalArgumentException exception :-
             
      [error] java.lang.IllegalArgumentException: Could not find proxy for projectRef: sbt.ProjectRef in
      List(value projectRef, value $anonfun, method sbtdef, method $sbtdef, object fb70afe92bc9a6fedc3,
      package <empty>, package <root>) (currentOwner= method $sbtdef )
     */

    val sources = (projectRef / Compile / sourceDirectories).value
    sources.foreach( println )
  }
}

Link 用于简化项目以重现问题:-

https://github.com/moglideveloper/Example


步骤:

从命令行转到 ApiSpec 目录 并在命令下面 运行 :-

sbt showAllSourceDirs

预期输出:打印 Api 和 ApiSpec 项目

的所有源目录

实际输出:抛出 java.lang.IllegalArgumentException

我相信你不能这样做,因为 sbt 使用宏。您在这里可以做的是将 ApisourceDirectories 添加到 ApiSpecsourceDirectories 中。这意味着,如果您将以下内容添加到您的 sbt 中:

Compile / sourceDirectories ++= (apiModule / Compile / sourceDirectories).value

然后,当运行:

sbt sourceDirectories

你得到输出:

[info] * /workspace/games/Example/ApiSpec/src/main/scala-2.12
[info] * /workspace/games/Example/ApiSpec/src/main/scala
[info] * /workspace/games/Example/ApiSpec/src/main/java
[info] * /workspace/games/Example/ApiSpec/target/scala-2.12/src_managed/main
[info] * /workspace/games/Example/Api/src/main/scala-2.12
[info] * /workspace/games/Example/Api/src/main/scala
[info] * /workspace/games/Example/Api/src/main/java
[info] * /workspace/games/Example/Api/target/scala-2.12/src_managed/main

您需要注意一件事 - 您正在覆盖当前的 sourceDirectories,因此请确保您没有在其他任何地方使用它。

另一个注意事项是,您需要在您拥有的每个依赖项上添加这一行。所以我不确定你的项目有多大,可行性如何。

如果你想有不同的任务,你可以这样做,但是使用模块本身,而不是通过反射,再次由于宏。

lazy val showAllSourceDirs = taskKey[Unit]("show source directories of all projects")
showAllSourceDirs := {
  println((apiSpecProject / Compile / sourceDirectories).value)
  println((apiModule / Compile / sourceDirectories).value)
}