dev、staging、production環境などの3つの環境向けにsbt、sbt-native-packager、およびsbt-proguardを使用してパッケージを作成しています。私がしたいのは、プログアードを使ってパッケージを作るかどうかを指定できるようにすることです。たとえば、次のコマンドは、パッケージ使用ProGuardの作成:いくつかのシステムプロパティが指定されている場合、proguardタスクをスキップするようにSBTを設定する方法。
$ sbt -Dforceobfuscate=true -Denv=dev rpm:pakageBin
をしかし、次のコマンドを実行すると、私は2つの設定を試してみました何ProGuardの
$ sbt -Denv=dev rpm:packageBin
せずにパッケージを作ります。 1つはシステムプロパティ条件によってタスクをオーバーライドし、2つは動的タスクでタスクをオーバーライドします。
1.システムプロパティでタスクを優先してオーバーライドします。
ProguardKeys.proguard in Proguard := {
if (sys.props.get("forceobfuscate").isDefined) {
(ProguardKeys.proguard in Proguard).value
} else {
Seq(new File("dummy"))
}
}
この設定は常に実行ProGuardのタスク(なぜ私は知りません)。 また、タスクを上書きできるタスクを停止できることを確認するために、以下の設定を試しました。
ProguardKeys.proguard in Proguard := {
if (sys.props.get("forceobfuscate").isDefined) {
// (ProguardKeys.proguard in Proguard).value
Seq(new File("dummy"))
} else {
Seq(new File("dummy"))
}
}
上記の設定は、常にプロガードタスクをスキップします。
2.動的タスクを使用したオーバーライドタスク。その後
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
I次のエラーました:私は、エラーがProGuardのための設定がないことを言うと思いますが、私は、ダイナミック使って設定を設定するかどうかはわからない
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$4.apply(Settings.scala:516)
at sbt.Init$$anon$4.apply(Settings.scala:516)
at sbt.$tilde$greater$$anon$6.apply(TypeFunctions.scala:39)
at sbt.$tilde$greater$$anon$6.apply(TypeFunctions.scala:39)
at sbt.std.FullInstance$$anonfun$flatten$1$$anonfun$apply$3.apply(TaskMacro.scala:51)
at sbt.std.FullInstance$$anonfun$flatten$1$$anonfun$apply$3.apply(TaskMacro.scala:51)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
at sbt.std.Transform$$anon$4.work(System.scala:63)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
at sbt.Execute.work(Execute.scala:237)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228)
at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
at sbt.CompletionService$$anon$2.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
を仕事。
上記のコマンドをうまく機能させたいと思います。どんな解決策でも問題ありません。