显示当前项目的 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 使用宏。您在这里可以做的是将 Api
的 sourceDirectories
添加到 ApiSpec
的 sourceDirectories
中。这意味着,如果您将以下内容添加到您的 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)
}
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 使用宏。您在这里可以做的是将 Api
的 sourceDirectories
添加到 ApiSpec
的 sourceDirectories
中。这意味着,如果您将以下内容添加到您的 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)
}