有条件地包括与sbt和通用插件提供的范围依赖性

luc*_*cas 11 scala sbt sbt-native-packager

我有一个scala和scalatra API项目.我有两个可以使用sbt-native-packager构建的可分发项 -

  1. RPM和DEB安装用于内部部署安装
  2. heroku安装用于云安装

我目前正在使用provided范围依赖项来处理我需要使用RPM/DEB方法手动管理的项目 - 由于许可证限制我无法捆绑和分发的数据库库.

"mysql" % "mysql-connector-java" % "5.1.30" % "provided",
"com.microsoft" % "sqlserver.jdbc" % "4.1" % "provided",
..etc..
Run Code Online (Sandbox Code Playgroud)

这一直很有效.我使用通用插件和dist任务,有点按摩,然后连接一些包构建脚本.

现在我正在构建heroku安装,我不知道如何在这些提供的依赖项中添加回来.我正在使用通用插件并运行stage任务.但是,提供的依赖项被过滤掉了,我想在运行时实际包含它们stage,因为我在heroku中不再拥有许可证限制.

我觉得我有的选择......

  1. 添加a mapping以在stage任务期间添加回提供的范围依赖关系,但不在dist任务期间添加
  2. 完全删除提供范围并手动从包装过程中排除这些依赖关系 dist

我有一些像这样的映射,

//add webapp dir to zip
mappings in Universal ++= directory("src/main/webapp")

//add db dir to zip, but move it into /lib/db instead of /db
mappings in Universal ++= (directory("src/main/resources/db").map{t => 
    (t._1, "lib/"+t._2)
  }
)
Run Code Online (Sandbox Code Playgroud)

所以我觉得如果我真的尝试过,我可能想知道如何添加/排除,但是我在找到这些东西的任何文档时遇到了问题.这里的例子并没有多大帮助,或者我不够了解.

提前致谢!

Muk*_*uki 6

这是个有趣的问题。不久前,我们增加了从构建类路径添加任意工件的可能性。(也请参见scaladocs

选项1可能看起来像这样。请注意,这不符合我的预期,因为某些映射未由native-packager完全拾取:

// `show universal::stage:mappings` works properly
mappings in (Universal, stage) ++= {
  // calculate provided dependencies.
  val compileDep = (managedClasspath in Compile).value.toSet
  val runtimeDep = (managedClasspath in Runtime).value.toSet
  val provided = compileDep -- runtimeDep

  // create mappings
  fromClasspath(provided.toSeq, "jar", artifact => true)
}
Run Code Online (Sandbox Code Playgroud)

我通过提供构建环境并确定要添加的映射来建议选项1的一种变体。

mappings in Universal ++= {
  // a build environment
  val env = buildEnv.value

  // calculate provided dependencies.
  val compileDep = (managedClasspath in Compile).value.toSet
  val runtimeDep = (managedClasspath in Runtime).value.toSet
  val provided = compileDep -- runtimeDep

  // create mappings, depending on build environment
  fromClasspath(provided.toSeq, "jar", _ => env == BuildEnv.Stage)
}

// add the dependencies to the start script as well
scriptClasspath ++= { /* similar code as above */}
Run Code Online (Sandbox Code Playgroud)

我想做什么

我希望能够做到这样

libraryDependencies += "com.google.guava" % "guava" % "19.0" % "provided"

mappings in (Universal, stage) ++= fromClasspath(
   (managedClasspath in Compile).value,
   "jar",
    artifact => artifact.scope == "provided"
)
Run Code Online (Sandbox Code Playgroud)

这是不可能的,因为sbt Artifact无法访问常春藤范围(或者我还没有找到它)。

然后我尝试这样做

libraryDependencies += "com.google.guava" % "guava" % "19.0" % "provided" extra("heroku" -> "true")

mappings in (Universal, stage) ++= fromClasspath(
   (managedClasspath in Compile).value,
   "jar",
    artifact => artifact.extra.find(_ == "heroku")
      .map(_.toBoolean)
      .getOrElse(false)
)
Run Code Online (Sandbox Code Playgroud)

这也不起作用,因为SBT似乎没有将extra属性从ModuleID传递给Artifact模型。这给了我上述解决方案。

  • 使用scriptClasspath ++ = {..same something ..}添加了它们 (2认同)