如果我在SBT中的构建定义项目(在/ project / src / main / scala中)编写了一些源代码。现在我想在我正在构建的项目中使用这些类。有最好的做法吗?目前我已经创建了一个自定义任务,可以复制.scala文件。
答案 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中看起来像这样:
答案 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)将有问题的类放在一个单独的项目中,并从构建和项目中依赖它。这是整体上最干净的解决方案,但你可能会认为它太重了。
希望这会有所帮助。也有兴趣看到别人对此的看法。