Scala SBT - sbt-native-packager,如何指定自定义阶段目录

Posted

技术标签:

【中文标题】Scala SBT - sbt-native-packager,如何指定自定义阶段目录【英文标题】:Scala SBT - sbt-native-packager, how to specify custom stage directory 【发布时间】:2016-10-12 14:20:03 【问题描述】:

如何为多项目配置指定自定义暂存目录?我正在使用sbt-native-packager

下面是我的多模块配置草图。当我暂存这个项目(sbt stage)时,文件被写入

common/target/universal/stage
app1/target/universal/stage
app2/target/universal/stage

我想像这样传递一个环境变量stageSuffixsbt stage -DstageSuffix=XYZ。此变量应使其将项目暂存到以下目录:

common/target/universal/stage-XYZ
app1/target/universal/stage-XYZ
app2/target/universal/stage-XYZ

我尝试在commonSettings 中修改stagingDirectory,但效果不佳,我收到类似“对未定义设置的引用”之类的错误。

我怎样才能做到这一点?

val stageSuffix = sys.props.getOrElse("stageSuffix", ".")

val commonSettings = Seq(
  stagingDirectory := stagingDirectory.value / stageSuffix, // this makes it fail
  libraryDependencies ++= Seq(...))

val common = project.in(file("common"))
  .enablePlugins(JavaAppPackaging)
  .settings(commonSettings: _*)

val app1 = project.in(file("app1"))
  .enablePlugins(JavaAppPackaging)
  .settings(mainClass in Compile := Some("app1.Main"))
  .dependsOn(common)
  .settings(commonSettings: _*)
  .settings(libraryDependencies ++= Seq(...))

val app2 = project.in(file("app2"))
  .enablePlugins(JavaAppPackaging)
  .settings(mainClass in Compile := Some("app2.Main"))
  .dependsOn(common)
  .settings(commonSettings: _*)
  .settings(libraryDependencies ++= Seq(...))

val main = project.in(file("."))
  .dependsOn(common, app1, app2)
  .aggregate(common, app1, app2)
  .settings(commonSettings: _*)

【问题讨论】:

在引用stagingDirectory 时出现“对未定义设置的引用”设置错误吗?了解哪些设置特别有问题会有所帮助。 是的,删除该设置将使构建通过,但在标准暂存位置:target/universal/stage 【参考方案1】:

我设法让它像这样工作:

val stagingDirectoryOverrideOpt = sys.props.get("stageSuffix").map  stageSuffix =>
  stagingDirectory in Universal := 
    val stageFile = (stagingDirectory in Universal).value
    new File(stageFile.getParentFile, s"stage-$stageSuffix")
  


val app1 = project.in(file("app1"))
  .enablePlugins(JavaAppPackaging)
  .settings(mainClass in Compile := Some("app1.Main"))
  .dependsOn(common)
  .settings(commonSettings: _*)
  .settings(stagingDirectoryOverrideOpt.toSeq: _*)
  .settings(libraryDependencies ++= Seq(...))

希望有办法让它更漂亮

【讨论】:

以上是关于Scala SBT - sbt-native-packager,如何指定自定义阶段目录的主要内容,如果未能解决你的问题,请参考以下文章

SBT 项目刷新失败 [IntelliJ、Scala、SBT]

使用 sbt 构建 scala 项目时,scala 的版本有啥关系?

使用SBT构建Scala应用转载

sbt 不能正常工作 - 找不到模块:org.scala-sbt

IntelliJ 14 - 创建/导入 Scala / SBT 项目

如何更改 sbt 项目的 Scala 版本?