我有一个scala& amp;项目。 scalatra API。我有两个可以使用sbt-native-packager -
构建的可分发项我目前正在使用provided
范围依赖项来处理我需要使用RPM / DEB方法手动管理的项目 - 由于许可证限制我无法捆绑和分发的数据库库。
"mysql" % "mysql-connector-java" % "5.1.30" % "provided",
"com.microsoft" % "sqlserver.jdbc" % "4.1" % "provided",
..etc..
这一直很有效。我使用通用插件和dist
任务,有点按摩,然后连接一些包构建脚本。
现在我正在构建heroku安装,我不知道如何在这些提供的依赖项中添加回来。我正在使用通用插件并运行stage
任务。但是,提供的依赖项被过滤掉了,我想在运行stage
时实际包含它们,因为我在heroku中不再拥有许可限制。
我认为我有的选项......
mapping
以在stage
任务期间添加回提供的范围依赖关系,但不会在dist
任务期间添加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)
}
)
所以我觉得如果我真的尝试过,我可能想知道如何添加/排除,但是我在找到这些东西的任何文档时遇到了问题。示例here并没有太大帮助,或者我不够了解。
提前致谢!
答案 0 :(得分:4)
这是一个有趣的问题。前段时间我们从构建类路径中添加add arbitrary artifacts的可能性。 (也见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)
}
我建议通过提供build environment并确定选项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 */}
我希望能够做到这样的事情
libraryDependencies += "com.google.guava" % "guava" % "19.0" % "provided"
mappings in (Universal, stage) ++= fromClasspath(
(managedClasspath in Compile).value,
"jar",
artifact => artifact.scope == "provided"
)
这是不可能的,因为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)
)