首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨平台编译

跨平台编译
EN

Stack Overflow用户
提问于 2019-02-28 20:15:32
回答 1查看 91关注 0票数 1

我想创建sbt跨平台(Hello world app ),包括JVM,Scala Native,Android和scalajs,我已经成功编译了除了android之外的所有平台,这是我的build.sbt:

代码语言:javascript
复制
name := "Cross-Platforms-ScalaNative-JVM"

import sbtcrossproject.CrossPlugin.autoImport.{crossProject, CrossType}

val sharedSettings = Seq(scalaVersion := "2.11.12")

lazy val bar =
// select supported platforms
  crossProject(JSPlatform, JVMPlatform, NativePlatform)
    .crossType(CrossType.Full)
    .settings(sharedSettings)
    .jsSettings(
      libraryDependencies += "org.querki" %%% "jquery-facade" % "1.2") 
    .jvmSettings(/* ... */)
    .nativeSettings(/* ... */)

lazy val barJS     = bar.js
lazy val barJVM    = bar.jvm
lazy val barNative = bar.native

我的问题是如何在这个项目中创建一个android平台;我的SBT应该有哪些变化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-04 05:17:54

Android构建基本上是一个带有额外步骤的JVM构建-获取JVM字节码,可选地运行proguard以最小化代码,并将其编译为Android格式。

这里有很多关于如何在sbt:https://scala-android.org/quickstart/中设置普通安卓构建的信息。

不同之处在于,只将androidBuild (和所有与安卓相关的设置)应用于JVM项目:

代码语言:javascript
复制
val myProjectJVM = myProject.jvm
  .settings(androidBuild: _*)

然而,考虑到Android构建和普通Scala构建看起来会有所不同(因为普通的JVM应用程序在架构上与Android应用程序几乎没有关系--例如Main.main(Array[String]) vs. Android片段和服务),最好是为一些共享的JVM代码创建一个模块,并为特定于平台的部分创建一个专门的项目:

代码语言:javascript
复制
val commonJVM = myProject.jvm
val myProjectJVM = project.in(file("java-specific"))
  .dependsOn(commonJVM)
val myProjectAndroid = project.in(file("android-specific"))
  .settings(androidBuild)
  .dependsOn(commonJVM)

这种架构差异很可能是为什么没有人考虑将Android作为跨项目的第四个选项的原因-你有不同的运行时依赖项,不同的启动应用程序的方式,所以你会有更多的代码部分不同于共同的。具有依赖于公共依赖项(甚至是交叉编译的依赖项)的专用于平台的代码的子模块是更好的主意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54925529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档