如何在SBT中的项目和构建定义项目之间共享代码

时间:2014-04-10 11:38:12

标签: scala sbt

如果我在SBT中的构建定义项目(在/ project / src / main / scala中)编写了一些源代码。现在我想在我正在构建的项目中使用这些类。有最好的做法吗?目前我已经创建了一个自定义任务,可以复制.scala文件。

3 个答案:

答案 0 :(得分:5)

这些似乎是不必要的间接机制。

unmanagedSourceDirectories in Compile += baseDirectory.value / "project/src/main"

答案 1 :(得分:5)

尽可能简单地分享sourceDirectories的答案是最简单的方法,但遗憾的是它不能与IntelliJ一起使用,因为项目模型不允许在多个模块之间共享源根源

Seth Tisue的方法可行,但需要重建以更新来源。

要实际共享源代码并直接使用IntelliJ,可以在构建中定义一个模块。

以下方法似乎仅适用于sbt 1.0 +

创建文件project/metabuild.sbt

val buildShared = project
val buildRoot = (project in file("."))
  .dependsOn(buildShared)

和您的build.sbt

val buildShared = ProjectRef(file("project"), "buildShared")
val root = (project in file("."))
  .dependsOn(buildShared)

然后将您的共享代码放入project/buildShared/src/main/scala/并刷新。您的项目在IntelliJ中看起来像这样:

enter image description here

完整的示例项目:https://github.com/jastice/shared-build-sources

答案 2 :(得分:1)

你可以做以下工作吗?将有问题的类的源代码放在项目的一部分中,而不是构建定义的一部分; “使用Kryo序列化Scala对象图并将它们作为文件写入项目的类路径的任务”部分听起来像是resourceGenerators的完美工作(参见http://www.scala-sbt.org/0.13.2/docs/Howto/generatefiles.html)。然后唯一剩下的问题是如何从资源生成器引用已编译的类。我不熟悉Kryo。为了使用它,你需要在编译生成器时在类路径上编译编译的类,还是只需要在运行时的类路径上?如果后者足够,那就更容易了。你可以从testLoader in Test键获取一个类加载器,加载类并通过反射实例化一些对象,然后调用Kryo。

如果在编译资源生成器时确实需要编译的类在类路径上,那么你有一个鸡和蛋的问题,在编译项目之前无法编译构建,但当然是项目在编译构建定义之前也无法编译。在这种情况下,在我看来除了以外你别无选择:

1)您已经在做的解决方法(在这种情况下,“最佳做法”包括使用sourceGenerators将来源从您的构建定义复制到target/src_managed

2)将有问题的类放在一个单独的项目中,并从构建和项目中依赖它。这是整体上最干净的解决方案,但你可能会认为它太重了。

希望这会有所帮助。也有兴趣看到别人对此的看法。