您如何使用`ProjectRef`来引用sbt 1.x中的本地项目?

时间:2018-10-28 04:49:02

标签: scala sbt

在其他答案中有很多模糊的手法,或者与此相关的东西都指向了较旧版本的sbt(即0.12.x),但实际上没有人回答这个问题。

鉴于我有一个文件夹,并且已经运行:

sbt new scala/scala-seed.g8
name [Scala Seed Project]: one

sbt new scala/scala-seed.g8
name [Scala Seed Project]: two

我现在有一个看起来像这样的目录结构:

8   ./one/build.sbt
8   ./one/...
8   ./two/build.sbt
8   ./two/...
80  .

对,所以我现在去更改exampleone中的two命名空间,因此代码在相应的Hello.scala文件中看起来像这样:

package example.two

object Hello extends Greeting {
}

trait Greeting {
  lazy val greeting: String = "hello two"
}

和:

package example.one

object Hello extends Greeting with App {
  println(greeting)
  println(example.two.Hello.greeting)
}

trait Greeting {
  lazy val greeting: String = "hello one"
}

现在,如何准确地使one中的代码编译并运行?

从我已完成的阅读看来,我应该在one/project/Dependencies.scala中做类似的事情:

import sbt._

object Dependencies {
  lazy val scalaTest = "org.scalatest" %% "scalatest" % "3.0.5"
  lazy val two = ProjectRef(file("../two"), "two") <------------ ADD THIS
}

,并在one/build.sbt中:

import Dependencies._

lazy val root = (project in file("."))
  .dependsOn(two) <--------------------- ADD THIS
  .settings(
    inThisBuild(List(
      organization := "com.example",
      scalaVersion := "2.12.7",
      version      := "0.1.0-SNAPSHOT"
    )),
    name := "one",
    libraryDependencies += scalaTest % Test
  )

...但是它不起作用:

92-168-1-4:one doug$ sbt run
[info] Loading settings for project global-plugins from idea.sbt ...
[info] Loading global plugins from /Users/doug/.sbt/1.0/plugins
[info] Loading project definition from /Users/doug/tmp/one/project
[info] Compiling 1 Scala source to /Users/doug/tmp/one/project/target/scala-2.12/sbt-1.0/classes ...
[info] Done compiling.
[info] Loading settings for project root from build.sbt ...
[info] Loading project definition from /Users/doug/tmp/two/project
[info] Loading settings for project root from build.sbt ...
[error] java.lang.RuntimeException: No project 'two' in 'file:/Users/doug/tmp/two/'.
[error] Valid project IDs: root
[error]     at scala.sys.package$.error(package.scala:26)

“ [错误]有效的项目ID:根”是什么意思?

我是完全错误的吗?正在使用sbt publishLocal之类的东西?

我找不到任何有意义的文档来说明如何使用当前项目中 not 子模块的本地库;我错过了SBT文档的一部分吗?

the 1.x documentationInter-project dependencies的部分似乎根本没有解释,只是讨论了跟踪引用...

帮助?

1 个答案:

答案 0 :(得分:1)

完整的错误消息是:

No project 'two' in 'file:/Users/doug/tmp/two/'.
Valid project IDs: root
at scala.sys.package$.error(package.scala:26)

所以问题在于您的文件夹two不包含名为two的项目,而仅包含名为root的项目(由g8模板创建)。请注意,name := …在这里无关紧要,这只会在项目元数据中设置名称,而不会设置sbt本身用于引用项目的名称。

要继续,您可以尝试:

  • lazy val root文件中的lazy val two更改为two/build.sbt
  • ProjectRef(…, "two")更改为ProjectRef(…, "root")