如何在sbt多项目构建中获取子项目路径

Kni*_*t71 5 scala sbt

我试图在sbt中的多项目构建中获得子项目的位置.但我只能获得根项目目录.

lazy val copyToResources = taskKey[Unit]("copies the assembly jar.")
private val rootLocation: File = file(".").getAbsoluteFile
private val subProjectLocation: File =  file("sub_project").getAbsoluteFile.getParentFile
lazy val settings = Seq(copyToResources := {
val absPath = subProjectLocation.getAbsolutePath
println(s"rootLocation:$subProjectLocation $absPath, sub-proj-location: ${rootLocation.getAbsolutePath}")
 })
Run Code Online (Sandbox Code Playgroud)

输出:

 rootLocation:/home/user/projects/workarea/repo /home/vdinakaran/projects/workarea/repo, sub-proj-location: /home/vdinakaran/projects/workarea/repo
 rootLocation:/home/user/projects/workarea/repo /home/vdinakaran/projects/workarea/repo, sub-proj-location: /home/vdinakaran/projects/workarea/repo
Run Code Online (Sandbox Code Playgroud)

目录结构:

repo
   |-- sub_project
Run Code Online (Sandbox Code Playgroud)

作为解决方法,我使用rootLocation添加了sub_project文件夹.但为什么文件("sub_project")没有返回路径?

lau*_*lic 7

如果您像这样定义子项目

lazy val subProject = project in file("sub_project") // ...
Run Code Online (Sandbox Code Playgroud)

然后你可以使用范围baseDirectory设置获取其路径:

baseDirectory.in(subProject).value.getAbsolutePath
Run Code Online (Sandbox Code Playgroud)

或者在sbt控制台中:

> show subProject/baseDirectory
Run Code Online (Sandbox Code Playgroud)

关于代码的问题(除了你在输出中混合了根和子项目之外)是相对路径的使用.关于Paths的 Sbt文档明确说明

只有在定义项目的基本目录时才应使用相关文件,这些目录将在适当的情况下得到解决.

在其他地方,文件应该是绝对的,或者从绝对基础文件构建.该baseDirectory设置根据范围定义构建或项目的基本目录.