如何在SBT中为Jan Berkel的Android插件添加更多类似的任务和设置?

时间:2012-07-13 08:29:46

标签: android scala sbt android-install-apk sbt-android-plugin

我正在尝试为使用Jan Berkel's Android PluginScala扩展SBT

我有类似的操作和设置,例如已经定义的android:install-deviceandroid: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
    ))

似乎最后添加的内容总是涵盖了之前的那些内容。 有谁知道这个解决方案?

1 个答案:

答案 0 :(得分:1)

这个问题需要一些额外的信息。

以下是完整的源代码:https://github.com/ioreskovic/android-plugin

显然,您已将settingsAndroidInstall复制到AndroidFastInstall中的devSettings。然后,您在AndroidLaunch

中添加了新的任务键

您遇到的问题是,显然调用dev-install-deviceinstall-device完全相同。这不是因为一个人覆盖了另一个人的可见性(他们都是可见的,只是他们做同样的事情)。问题是它们都依赖于同一组其他任务键,并且您将这些任务键更改两次 - 最后一次更改会影响之前的任务键。

更具体地说,问题在于:

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

了解这些settingsdevSettings序列中的内容:

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   <<<

此处您正在重新定义proguarddev-install-device所依赖的名为install-device的任务键。第一个proguardTask方法位于AndroidFastInstall,第二个位于AndroidInstall,他们执行不同的操作。由于你最后一次调用第二个,它重新定义了proguard任务的含义。

(我提请注意proguarddev-install-device传递所依赖的install-device任务键,但settings中还有其他此类任务键的示例和devSettings。)

要更好地理解这一点,您必须了解实际的设置和任务以及它们的工作原理:

有关如何声明任务键的示例,请参阅“定义键”。

有关如何实施任务的示例,请参阅“实施任务”和“基于其他键计算值”:&lt;&lt; =&lt; =&lt; =

它的要点是 - 首先通过:=<<=声明并实施任务键。可以多次调用<<= - 每次调用<<=都会重新执行任务键。

要解决您的问题,请为proguard和常规版本的任务创建单独的dev键。对proguard以外的冲突任务执行相同的操作。