当给定某些系统 属性 时,如何配置 SBT 以跳过 proguard 任务。
How to configure SBT to skip proguard task when some system property is given.
我正在使用 sbt、sbt-native-packager 和 sbt-proguard 为开发、暂存和生产环境等 3 个环境制作包。我想做的是能够指定是否使用混淆器来制作一个包。例如,以下命令 make package using proguard:
$ sbt -Dforceobfuscate=true -Denv=dev rpm:pakageBin
但是下面的命令make package without proguard
$ sbt -Denv=dev rpm:packageBin
我尝试了两种设置。一种是按系统 属性 条件覆盖任务,另一种是使用动态任务覆盖任务。
1.Just 系统覆盖任务 属性。
ProguardKeys.proguard in Proguard := {
if (sys.props.get("forceobfuscate").isDefined) {
( ProguardKeys.proguard in Proguard ).value
} else {
Seq(new File("dummy"))
}
}
这个设置总是运行混淆任务(我不知道为什么)。
我还尝试了以下设置,以确保覆盖任务可以停止任务。
ProguardKeys.proguard in Proguard := {
if (sys.props.get("forceobfuscate").isDefined) {
// ( ProguardKeys.proguard in Proguard ).value
Seq(new File("dummy"))
} else {
Seq(new File("dummy"))
}
}
确实,上面的设置总是跳过proguard任务。
2.Overriding 任务使用动态任务。
def obfuscateOrNot = Def.taskDyn {
if (sys.props.get("forceobfuscate").isDefined) {
Def.task {
( ProguardKeys.proguard in Proguard ).value
}
} else {
Def.task {
Seq(new File("dummy"))
}
}
}
ProguardKeys.proguard in Proguard := {
obfuscateOrNot.value
}
然后运行命令:
$ sbt rpm:packageBin
好的,这次跳过proguard任务。但是当我 运行 命令时:
$ sbt -Dforceobfuscate=true rpm:packageBin
我收到以下错误:
sbt.Init$RuntimeUndefined: References to undefined settings at runtime.
sbt.Init$RuntimeUndefined: References to undefined settings at runtime.
setting(ScopedKey(Scope(Select(ProjectRef(file:/work/backend/,backend)),Select(ConfigKey(proguard)),Global,Global),proguard)) at RangePosition(/work/backend/build.sbt,LineRange(244,247)) referenced from ScopedKey(Scope(Select(ProjectRef(file:/work/backend/,backend)),Select(ConfigKey(proguard)),Global,Global),proguard)
at sbt.Init$class.sbt$Init$$handleUndefined(Settings.scala:511)
at sbt.Init$$anon.apply(Settings.scala:516)
at sbt.Init$$anon.apply(Settings.scala:516)
at sbt.$tilde$greater$$anon.apply(TypeFunctions.scala:39)
at sbt.$tilde$greater$$anon.apply(TypeFunctions.scala:39)
at sbt.std.FullInstance$$anonfun$flatten$$anonfun$apply.apply(TaskMacro.scala:51)
at sbt.std.FullInstance$$anonfun$flatten$$anonfun$apply.apply(TaskMacro.scala:51)
at scala.Function1$$anonfun$compose.apply(Function1.scala:47)
at sbt.$tilde$greater$$anonfun$$u2219.apply(TypeFunctions.scala:40)
at sbt.std.Transform$$anon.work(System.scala:63)
at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:228)
at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:228)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
at sbt.Execute.work(Execute.scala:237)
at sbt.Execute$$anonfun$submit.apply(Execute.scala:228)
at sbt.Execute$$anonfun$submit.apply(Execute.scala:228)
at sbt.ConcurrentRestrictions$$anon$$anonfun.apply(ConcurrentRestrictions.scala:159)
at sbt.CompletionService$$anon.call(CompletionService.scala:28)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
[error] (proguard:proguard) sbt.Init$RuntimeUndefined: References to undefined settings at runtime.
[error] setting(ScopedKey(Scope(Select(ProjectRef(file:/work/backend/,backend)),Select(ConfigKey(proguard)),Global,Global),proguard)) at RangePosition(/work/backend/build.sbt,LineRange(244,247)) referenced from ScopedKey(Scope(Select(ProjectRef(file:/work/backend/,backend)),Select(ConfigKey(proguard)),Global,Global),proguard)
[error] Total time: 1 s, completed 2017/07/29 12:09:24
我认为错误是说没有 proguard 设置,但我不确定如何使用动态任务设置设置。
我想让上面的命令运行良好。任何解决方案都可以。
我找到了解决办法。解决方案是根据条件使 proguard Seq[Setting[_]]
值。
lazy val customProguardSettings =
if (sys.props.get("forceobfuscate").isDefined) {
proguardSettings ++ Seq( ... )
} else {
Nil
}
customProguardSettings
我正在使用 sbt、sbt-native-packager 和 sbt-proguard 为开发、暂存和生产环境等 3 个环境制作包。我想做的是能够指定是否使用混淆器来制作一个包。例如,以下命令 make package using proguard:
$ sbt -Dforceobfuscate=true -Denv=dev rpm:pakageBin
但是下面的命令make package without proguard
$ sbt -Denv=dev rpm:packageBin
我尝试了两种设置。一种是按系统 属性 条件覆盖任务,另一种是使用动态任务覆盖任务。
1.Just 系统覆盖任务 属性。
ProguardKeys.proguard in Proguard := {
if (sys.props.get("forceobfuscate").isDefined) {
( ProguardKeys.proguard in Proguard ).value
} else {
Seq(new File("dummy"))
}
}
这个设置总是运行混淆任务(我不知道为什么)。 我还尝试了以下设置,以确保覆盖任务可以停止任务。
ProguardKeys.proguard in Proguard := {
if (sys.props.get("forceobfuscate").isDefined) {
// ( ProguardKeys.proguard in Proguard ).value
Seq(new File("dummy"))
} else {
Seq(new File("dummy"))
}
}
确实,上面的设置总是跳过proguard任务。
2.Overriding 任务使用动态任务。
def obfuscateOrNot = Def.taskDyn {
if (sys.props.get("forceobfuscate").isDefined) {
Def.task {
( ProguardKeys.proguard in Proguard ).value
}
} else {
Def.task {
Seq(new File("dummy"))
}
}
}
ProguardKeys.proguard in Proguard := {
obfuscateOrNot.value
}
然后运行命令:
$ sbt rpm:packageBin
好的,这次跳过proguard任务。但是当我 运行 命令时:
$ sbt -Dforceobfuscate=true rpm:packageBin
我收到以下错误:
sbt.Init$RuntimeUndefined: References to undefined settings at runtime.
sbt.Init$RuntimeUndefined: References to undefined settings at runtime.
setting(ScopedKey(Scope(Select(ProjectRef(file:/work/backend/,backend)),Select(ConfigKey(proguard)),Global,Global),proguard)) at RangePosition(/work/backend/build.sbt,LineRange(244,247)) referenced from ScopedKey(Scope(Select(ProjectRef(file:/work/backend/,backend)),Select(ConfigKey(proguard)),Global,Global),proguard)
at sbt.Init$class.sbt$Init$$handleUndefined(Settings.scala:511)
at sbt.Init$$anon.apply(Settings.scala:516)
at sbt.Init$$anon.apply(Settings.scala:516)
at sbt.$tilde$greater$$anon.apply(TypeFunctions.scala:39)
at sbt.$tilde$greater$$anon.apply(TypeFunctions.scala:39)
at sbt.std.FullInstance$$anonfun$flatten$$anonfun$apply.apply(TaskMacro.scala:51)
at sbt.std.FullInstance$$anonfun$flatten$$anonfun$apply.apply(TaskMacro.scala:51)
at scala.Function1$$anonfun$compose.apply(Function1.scala:47)
at sbt.$tilde$greater$$anonfun$$u2219.apply(TypeFunctions.scala:40)
at sbt.std.Transform$$anon.work(System.scala:63)
at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:228)
at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:228)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
at sbt.Execute.work(Execute.scala:237)
at sbt.Execute$$anonfun$submit.apply(Execute.scala:228)
at sbt.Execute$$anonfun$submit.apply(Execute.scala:228)
at sbt.ConcurrentRestrictions$$anon$$anonfun.apply(ConcurrentRestrictions.scala:159)
at sbt.CompletionService$$anon.call(CompletionService.scala:28)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
[error] (proguard:proguard) sbt.Init$RuntimeUndefined: References to undefined settings at runtime.
[error] setting(ScopedKey(Scope(Select(ProjectRef(file:/work/backend/,backend)),Select(ConfigKey(proguard)),Global,Global),proguard)) at RangePosition(/work/backend/build.sbt,LineRange(244,247)) referenced from ScopedKey(Scope(Select(ProjectRef(file:/work/backend/,backend)),Select(ConfigKey(proguard)),Global,Global),proguard)
[error] Total time: 1 s, completed 2017/07/29 12:09:24
我认为错误是说没有 proguard 设置,但我不确定如何使用动态任务设置设置。
我想让上面的命令运行良好。任何解决方案都可以。
我找到了解决办法。解决方案是根据条件使 proguard Seq[Setting[_]]
值。
lazy val customProguardSettings =
if (sys.props.get("forceobfuscate").isDefined) {
proguardSettings ++ Seq( ... )
} else {
Nil
}
customProguardSettings