2017-07-29 8 views
0

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 

を仕事。

上記のコマンドをうまく機能させたいと思います。どんな解決策でも問題ありません。

答えて

1

解決策が見つかりました。解決策は条件に応じてproguard Seq[Setting[_]]の値を変更しています。

lazy val customProguardSettings = 
    if (sys.props.get("forceobfuscate").isDefined) { 
    proguardSettings ++ Seq(...) 
    } else { 
    Nil 
    } 

customProguardSettings 
関連する問題