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

标签 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  .

好的,所以我现在去更改 onetwo 中的 example 命名空间,因此代码在各自的 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/Dependency.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:root”是什么意思?

我这样做完全错误吗?应该例如。使用 sbtpublishLocal 还是其他东西?

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

the 1.x documentation 中有关项目间依赖关系的部分似乎根本没有解释这一点,它只是谈论跟踪引用......

帮忙?

最佳答案

完整的错误消息是:

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 本身用来引用项目的名称。

要继续,您可以尝试:

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

关于scala - 如何使用 `ProjectRef` 来引用 sbt 1.x 中的本地项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53028440/

相关文章:

linux - SBT 请求命令

scala - SBT:插件依赖项和项目类路径

sbt - 如何在执行命令后保持 sbt 运行(作为守护进程)

scala - Spark mapWithState 将所有数据混洗到一个节点

scala - 用 Scala 为 Kafka API 0.10 : custom AVRO deserializer 编写的 Kafka Consumer for Spark

javascript - 如何将脚本传递给 main.scala.html - Play ! 2个

playframework - 如何使用 sbt/play 2.0 为 Dart 定义一个外部 "builder tool"?

java - 在磁盘上写入文件的进程每秒的请求数较低

javascript - 如何在真实浏览器中运行 ScalaJs 测试?

apache-spark - NoClassDefFoundError : org/apache/spark/sql/internal/connector/SimpleTableProvider when running in Dataproc