Chris J Harris
Chris J Harris

Reputation: 1851

How to import unmanaged dependencies into code

I'm trying to use sbt to pull down an existing github project and then (obviously) use it in my code. My abbreviated build.sbt is shown below:

lazy val myProjInGit = RootProject(
  uri("git://github.com/me/sheet-ref.git#master"))

lazy val root = (project in file("."))
  .dependsOn(myProjInGit)
  .settings(
    name := "MainProj",
  )

libraryDependencies ++= Seq( /*other stuff... */)

This is probably a basic one, but how should I then be importing this into code? Could I use, say, import myProjInGit.SampleObject.sampleFunction in my Main.scala? I can see a disconcerting lack of info on SO about this topic so I'm not sure that I'm not barking up completely the wrong tree. Thanks in advance for any help.

EDIT: some further details here. The project I am trying to import is just a library, so it only contains a package object. To try to debug things a little, I'm trying to import it as a ProjectRef, rather than a RootProject. I've discovered the projects sbt command, and if I run it on the project I'm trying to import (not the main one), it gives me:

sbt:SheetRef> projects
[info] In file:/data/va-projects/sheet-ref/
[info]   * SheetRef

So... it seems that external project is called SheetRef. If I try to import SheetRef using

lazy val sheetRef = ProjectRef(
  uri("git://github.com/me/sheet-ref.git#master"), "SheetRef")

then I get an sbt error:

[error] No project 'SheetRef' in 'git://github.com/me/sheet-r
ef.git#master'.
[error] Valid project IDs: root

Which feels unintuitive. I can import it as root, but then I seem to be unable to access it from my code - if it requires an import statement, it's not obvious to me what it should be.

Upvotes: 2

Views: 211

Answers (2)

JaySon
JaySon

Reputation: 377

Is there someone that made such a thing work? I am trying the same, and somehow manage to get the git project imported but I have no idea how to access the imported scala components.

Upvotes: 0

Alexey Romanov
Alexey Romanov

Reputation: 170805

The dependency has to be an SBT project, so SBT knows how to build it. If it is, then yes, you access it just like any other dependency in your code, because it's added to the classpath (after being built) just like any other dependency.

Which feels unintuitive. I can import it as root, but then I seem to be unable to access it from my code - if it requires an import statement, it's not obvious to me what it should be.

The thing is, it doesn't matter how you add the dependency; it could be a normal library dependency, an unmanaged dependency, a source dependency, etc. Those are SBT concepts, which have no meaning to the Scala compiler.

So the import statement can't depend on project names, jar names or anything like that. In fact, it's the same as if you just put those files into your own project.

Upvotes: 2

Related Questions