Как добавить больше похожих задач и настроек в Android-плагин Яна Беркеля в SBT?

Я пытаюсь расширить Плагин Яна Беркеля для Android для Scala, который использует SBT.

У меня есть похожие действия и настройки, как уже определенные android:install-device и android:install-emulator.
Пусть они называются android:dev-install-device и android: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-device или android: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-device или android: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
    ))

Похоже, что последние добавленные всегда закрывают видимость предшествующих им. Кто-нибудь знает решение этого?


person ioreskovic    schedule 13.07.2012    source источник


Ответы (1)


Этот вопрос требует дополнительной информации.

Вот полный исходный код: https://github.com/ioreskovic/android-plugin.

Судя по всему, вы скопировали settings из AndroidInstall на devSettings в AndroidFastInstall. Затем вы добавили новые ключи задач в AndroidLaunch.

Проблема, с которой вы столкнулись, заключается в том, что, по-видимому, вызов dev-install-device делает то же самое, что и install-device. Это не потому, что один закрывает видимость другого (они оба видны, просто они делают одно и то же). Проблема в том, что они оба зависят от одного и того же набора других ключей задач, и вы меняете эти ключи задач дважды — последнее изменение затмевает предыдущее.

Точнее, ваша проблема здесь:

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, от которого зависят как dev-install-device, так и install-device. Первый метод proguardTask находится в AndroidFastInstall, второй — в AndroidInstall, и они делают разные вещи. Поскольку вы вызываете вторую последнюю, она переопределяет значение задачи proguard.

(Я обращаю внимание на ключ задачи proguard, от которого транзитивно зависят как dev-install-device, так и install-device, но есть и другие примеры таких ключей задачи в settings и devSettings.)

Чтобы понять это лучше, вы должны понять, что такое настройки и задачи на самом деле и как они работают:

См. «Определение ключа» для примеров того, как объявить ключ задачи.

См. «Реализация задачи» и «Вычисление значения на основе значений других ключей: ‹‹=", где приведены примеры реализации задачи.

Суть в том, что ключ задачи сначала объявляется, а затем реализуется через := и <<=. <<= может вызываться несколько раз — каждый вызов <<= повторно реализует ключ задачи.

Чтобы ваши проблемы исчезли, создайте отдельные proguard ключи для dev и обычных версий ваших задач. И сделайте то же самое для конфликтующих задач, отличных от proguard.

person axel22    schedule 18.07.2012