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

时间:2016-04-25 16:45:07

标签: scala sbt sbt-native-packager

我有一个scala& amp;项目。 scalatra API。我有两个可以使用sbt-native-packager -

构建的可分发项
  1. RPM& DEB安装用于内部部署安装
  2. 用于云安装的heroku安装
  3. 我目前正在使用provided范围依赖项来处理我需要使用RPM / DEB方法手动管理的项目 - 由于许可证限制我无法捆绑和分发的数据库库。

    "mysql" % "mysql-connector-java" % "5.1.30" % "provided",
    "com.microsoft" % "sqlserver.jdbc" % "4.1" % "provided",
    ..etc..
    

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

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

    我认为我有的选项......

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

      我有一些像这样的映射,

      //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并没有太大帮助,或者我不够了解。

      提前致谢!

1 个答案:

答案 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)
)

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