在SBT中的多项目构建下使用包生成根项目的工件

j3d*_*j3d 8 scala sbt

我在SBT中有一个多项目构建配置,它由两个相互依赖的不同模块组成.他们只是(碰巧)属于同一产品.

项目布局如下:

myLib
  + build.sbt
  + myProject_1
  |    + build.sbt
  |    + src
  |        + ...
  + myProject_2
  |    + build.sbt
  |    + src
  |        + ...
  + project
       + Build.scala
Run Code Online (Sandbox Code Playgroud)

project/Build.scala包含常见设置,如下所示:

import sbt._
import Keys._

object ApplicationBuild extends Build {

  val appVersion = "1.0-SNAPSHOT"

  val defaultScalacOptions = Seq(
    "-unchecked", "-deprecation", "-feature", "-language:reflectiveCalls",
    "-language:implicitConversions", "-language:postfixOps",
    "-language:dynamics", "-language:higherKinds", "-language:existentials",
    "-language:experimental.macros", "-Xmax-classfile-name", "140")

  val defaultResolvers = Seq(
    "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
  )

  val defaultLibraryDependencies = Seq(
    "org.specs2" %% "specs2" % "1.14" % "test",
    "org.slf4j" % "slf4j-nop" % "1.7.5" % "test"
  )

  val defaultSettings = Defaults.defaultSettings ++ Seq(
    scalacOptions ++= defaultScalacOptions,
    resolvers ++= defaultResolvers,
    libraryDependencies ++= defaultLibraryDependencies
  )
}
Run Code Online (Sandbox Code Playgroud)

根构建文件build.sbt只需要将所有内容放在一起[我也尝试删除它..但是子项目不再被编译]:

lazy val myProject_1 = project.in(file("myProject_1"))

lazy val myProject_2 = project.in(file("myProject_2"))
Run Code Online (Sandbox Code Playgroud)

最后这里是myProject_1/build.sbt [我刚刚省略了myProject_2/build.sbt,因为它非常相似,并没有为主题提供任何附加值]:

name := "myProject_1"

version := ApplicationBuild.appVersion

ApplicationBuild.defaultSettings

libraryDependencies ++= Seq(
  "commons-codec" % "commons-codec" % "1.8"
)
Run Code Online (Sandbox Code Playgroud)

项目编译成功...但是当我发出命令时sbt package,会在根目标目录中生成一个空jar:

j3d@gonzo:~/myLib/$ ll target/scala-2.10
drwxrwxr-x 2 j3d j3d 4096 Dez 23 17:13 ./
drwxrwxr-x 5 j3d j3d 4096 Dez 23 17:13 ../
-rw-rw-r-- 1 j3d j3d  273 Dez 23 17:13 brix_2.10-0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?如何防止SBT生成这个空无用的jar?

psp*_*psp 10

这非常难以实现.以下一组选项似乎可以实现目标.这些选项的子集倾向于通过某些执行路径而不是其他执行路径来抑制根jar,因此如果要查找最小覆盖,请确保'sbt package'和'sbt publishLocal'都不会创建jar.我花了很长时间才找到这一套,我不愿意进一步迭代.

      Keys.`package` :=  file(""),
packageBin in Global :=  file(""),
   packagedArtifacts :=  Map(),
Run Code Online (Sandbox Code Playgroud)

sbt:自2008年以来,简单的事情变得不可能.


Jac*_*ski 6

我提出了一个解决办法有下列(重新)定义packagebuild.sbt:

Keys.`package` := {
    (Keys.`package` in (a, Compile)).value
    (Keys.`package` in (b, Compile)).value
}
Run Code Online (Sandbox Code Playgroud)

where a(b是)(子)模块.

lazy val a = project

lazy val b = project
Run Code Online (Sandbox Code Playgroud)

由于package是Scala中的关键字,因此需要引用才能解析.

它还需要完全限定,因为默认情况下在构建文件中package导入Keys._sbt._导入.sbt.

/Users/jacek/sandbox/so/multi-packageBin/build.sbt:5: error: reference to package is ambiguous;
it is imported twice in the same scope by
import Keys._
and import sbt._
`package` := {
^
[error] Type error in expression
Run Code Online (Sandbox Code Playgroud)

另请注意,我使用的是SBT 0.13.2-SNAPSHOT(源自内置),因此请谨慎使用(但我怀疑它会对任何版本的SBT 0.13+产生影响).

[multi-packagebin]> */*:sbtVersion
[info] 0.13.2-SNAPSHOT
[multi-packagebin]> projects
[info] In file:/Users/jacek/sandbox/so/multi-packageBin/
[info]     a
[info]     b
[info]   * multi-packagebin
[multi-packagebin]> package
[info] Updating {file:/Users/jacek/sandbox/so/multi-packageBin/}a...
[info] Updating {file:/Users/jacek/sandbox/so/multi-packageBin/}b...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Resolving org.scala-lang#scala-reflect;2.10.3 ...
[info] Packaging /Users/jacek/sandbox/so/multi-packageBin/b/target/scala-2.10/b_2.10-0.1-SNAPSHOT.jar ...
[info] Done packaging.
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Packaging /Users/jacek/sandbox/so/multi-packageBin/a/target/scala-2.10/a_2.10-0.1-SNAPSHOT.jar ...
[info] Done packaging.
[success] Total time: 1 s, completed Feb 23, 2014 10:12:41 AM
Run Code Online (Sandbox Code Playgroud)