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

rei*_*kje 6 scala sbt

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

psp*_*psp 5

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

unmanagedSourceDirectories in Compile += baseDirectory.value / "project/src/main"
Run Code Online (Sandbox Code Playgroud)


Jus*_*ser 5

临时回答中的共享sourceDirectories是解决该问题的最简单方法,但是不幸的是,它与IntelliJ结合使用并不理想,因为项目模型不允许在多个模块之间共享源根。

塞思·提苏(Seth Tisue)的方法行之有效,但需要重建以更新源。

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

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

创建一个文件project/metabuild.sbt

val buildShared = project
val buildRoot = (project in file("."))
  .dependsOn(buildShared)
Run Code Online (Sandbox Code Playgroud)

并在您的build.sbt

val buildShared = ProjectRef(file("project"), "buildShared")
val root = (project in file("."))
  .dependsOn(buildShared)
Run Code Online (Sandbox Code Playgroud)

然后放入共享代码project/buildShared/src/main/scala/并刷新。您的项目在IntelliJ中将如下所示:

在此处输入图片说明

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


Set*_*sue 1

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

\n\n

如果您在编译资源生成器时确实需要将已编译的类放在类路径上,那么您就会遇到先有鸡还是先有蛋的问题,在项目编译完成之前无法编译构建,但项目当然可以\在编译构建定义之前也不会进行编译。在这种情况下,在我看来,你除了以下之外别无选择:

\n\n

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

\n\n

2)将相关类放在一个单独的项目中,并从您的构建和项目中依赖它。总体而言,这是最干净的解决方案,但您可能认为它太重量级了。

\n\n

希望这可以帮助。也有兴趣看看其他人对此的看法。

\n