Knight71 Knight71 - 9 days ago 5
Scala Question

how to get the sub project path in sbt multi project build

I am trying to get the location of sub project in multi-project build in sbt. But I am able to get only the root project directory.

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}")
})


Output:

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


directory structure:

repo
|-- sub_project


As a work around , I have added the sub_project folder using the rootLocation. But why the file("sub_project") is not returning the path ?

Answer

If you define your subproject like this

lazy val subProject = project in file("sub_project") // ...

then you can get its path using the scoped baseDirectory setting:

baseDirectory.in(subProject).value.getAbsolutePath

Or in the sbt console:

> show subProject/baseDirectory

About the problem with your code (beside that you mixed up root and sub-project in the output) is the usage of relative paths. Sbt documentation on Paths explicitly says

Relative files should only be used when defining the base directory of a Project, where they will be resolved properly.

Elsewhere, files should be absolute or be built up from an absolute base File. The baseDirectory setting defines the base directory of the build or project depending on the scope.

Comments