4

SBTを使用するJan Berkel の Android Plugin for Scalaを拡張しようとしています。

android:install-device既に定義されているとのような同様のアクションと設定がありますandroid:install-emulator。それらを とと
呼びましょう。 android:dev-install-deviceandroid:dev-install-emulator

に新しいキーを追加しましたAndroidKeys.scala:

val devInstallDevice = TaskKey[Unit]("dev-install-device")
val devInstallEmulator = TaskKey[Unit]("dev-install-emulator")

val devStartDevice = TaskKey[Unit]("dev-start-device", "Start package on device after installation")
val devStartEmulator = TaskKey[Unit]("dev-start-emulator", "Start package on emulator after installation")

にも追加しましたAndroidLaunch.scala

lazy val settings: Seq[Setting[_]] =
    //AndroidInstall.settings ++
    AndroidFastInstall.settings ++
    inConfig(Android) (Seq (
        devStartDevice <<= startTask(false),
        devStartEmulator <<= startTask(true),
        //startDevice <<= startTask(false),
        //startEmulator <<= startTask(true),

        devStartDevice <<= devStartDevice dependsOn devInstallDevice,
        devStartEmulator <<= devStartEmulator dependsOn devInstallEmulator
        //startDevice <<= startDevice dependsOn installDevice,
        //startEmulator <<= startEmulator dependsOn installEmulator
    ))

問題は、自分のタスクを利用可能にしたい場合、元の標準的なタスクをコメントアウトしなければならないことです。これはしたくありません。

私が見落としているものはありますか?


更新:
設定の順序を変えてみました。

の前にAndroidFastInstall来るとAndroidInstall、またはAndroidInstallを呼び出しても実行されます。android:install-deviceandroid:dev-install-device

  lazy val settings: Seq[Setting[_]] =
    AndroidFastInstall.settings ++
    inConfig(Android) (Seq (
      devStartDevice <<= devStartTask(false),
      devStartEmulator <<= devStartTask(true),

      devStartDevice <<= devStartDevice dependsOn devInstallDevice,
      devStartEmulator <<= devStartEmulator dependsOn devInstallEmulator
    ))++
    AndroidInstall.settings ++
    inConfig(Android) (Seq (
      startDevice <<= startTask(false),
      startEmulator <<= startTask(true),

      startDevice <<= startDevice dependsOn installDevice,
      startEmulator <<= startEmulator dependsOn installEmulator
    )) 

の前にAndroidInstall来るとAndroidFastInstall、またはAndroidFastInstallを呼び出しても実行されます。 android:install-deviceandroid:dev-install-device

  lazy val settings: Seq[Setting[_]] =
    AndroidInstall.settings ++
    inConfig(Android) (Seq (
      startDevice <<= startTask(false),
      startEmulator <<= startTask(true),

      startDevice <<= startDevice dependsOn installDevice,
      startEmulator <<= startEmulator dependsOn installEmulator
    )) ++
    AndroidFastInstall.settings ++
    inConfig(Android) (Seq (
      devStartDevice <<= devStartTask(false),
      devStartEmulator <<= devStartTask(true),

      devStartDevice <<= devStartDevice dependsOn devInstallDevice,
      devStartEmulator <<= devStartEmulator dependsOn devInstallEmulator
    ))

最後に追加されたものは、常にそれらの前のものの可視性をカバーしているようです。誰もこれに対する解決策を知っていますか?

4

1 に答える 1

1

この質問には追加情報が必要です。

完全なソース コードは次のとおりです: https://github.com/ioreskovic/android-plugin

どうやら、settingsfrom を inにAndroidInstallコピーしたようです。次に、新しいタスク キーを に追加しました。devSettingsAndroidFastInstallAndroidLaunch

あなたが抱えている問題は、呼び出しが明らかに とdev-install-deviceまったく同じことを行うことinstall-deviceです。これは、一方が他方の可視性をカバーするためではありません (両方とも可視であり、同じことを行うだけです)。問題は、それらが両方とも他のタスク キーの同じセットに依存しており、これらのタスク キーを 2 回変更することです。最後の変更は前の変更を隠します。

より具体的には、あなたの問題はここにあります:

lazy val settings: Seq[Setting[_]] =
  AndroidFastInstall.devSettings ++
  ...
  AndroidInstall.settings ++
  ...

settingsこれらとdevSettingsシーケンスの中身を見てみましょう:

AndroidFastInstall:

lazy val devSettings: Seq[Setting[_]] = inConfig(Android) (devInstallerTasks ++ Seq (
  uninstallEmulator <<= devUninstallTask(emulator = true),
  uninstallDevice <<= devUninstallTask(emulator = false),
  ...
  >>>   proguard <<= proguardTask   <<<

AndroidInstall:

lazy val settings: Seq[Setting[_]] = inConfig(Android) (installerTasks ++ Seq (
  uninstallEmulator <<= uninstallTask(emulator = true),
  uninstallDevice <<= uninstallTask(emulator = false),
  ...
  >>>   proguard <<= proguardTask   <<<

ここでは、 と の両方が依存するというタスク キーを再定義していproguardます。最初の方法は にあり、2 番目の方法は にあり、異なることを行います。2 番目のものを最後に呼び出すため、タスクの意味が再定義されます。dev-install-deviceinstall-deviceproguardTaskAndroidFastInstallAndroidInstallproguard

(ここではとのproguard両方が推移的に依存するタスク キーに注目していますが、 と にはそのようなタスク キーの例が他にもあります。)dev-install-deviceinstall-devicesettingsdevSettings

これをよりよく理解するには、設定とタスクの実際の内容と、それらがどのように機能するかを理解する必要があります。

タスク キーの宣言方法の例については、「キーの定義」を参照してください。

タスクの実装方法の例については、「タスクの実装」および「他のキーの値に基づく値の計算: <<=」を参照してください。

この要点は次のとおりです-タスクキーは最初に宣言され、後で and を介して実装され:=ます<<=。は<<=複数回呼び出すことができます。各呼び出し<<=でタスク キーが再実装されます。

問題を解消するには、タスクの通常のバージョンと別のproguardキーを作成します。dev以外の競合するタスクについても同じことを行いproguardます。

于 2012-07-18T16:53:27.270 に答える