4

我正在尝试为使用SBTScala扩展Jan Berkel 的 Android 插件

我有类似的操作和设置,比如已经定义android:install-deviceandroid:install-emulator.
让它们被称为android:dev-install-deviceand 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出现之前AndroidInstallAndroidInstall无论我调用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出现之前AndroidFastInstallAndroidFastInstall无论我调用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
    ))

似乎最后添加的总是覆盖它们之前的可见性。有谁知道这个问题的解决方案?

4

1 回答 1

1

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

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

显然,您已将settingsfrom in复制AndroidInstalldevSettingsin AndroidFastInstall。然后,您在 中添加了新的任务键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   <<<

在这里,您重新定义了一个名为proguardwhichdev-install-device和都install-device依赖的任务键。第proguardTask一种方法是 in AndroidFastInstall,第二种方法是 in ,AndroidInstall它们做不同的事情。由于您最后调用第二个,它重新定义了proguard任务的含义。

(我提请注意proguard两者dev-install-deviceinstall-device传递依赖的任务键,但在 和 中还有其他此类任务键的示例settingsdevSettings

为了更好地理解这一点,您必须了解真正的设置和任务以及它们是如何工作的:

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

有关如何实现任务的示例,请参阅“实现任务”和“根据其他键的值计算值:<<=”。

它的要点是 - 任务键首先通过:=and声明和实现<<=。可能会<<=被多次调用——每次调用都会<<=重新实现任务键。

为了让您的问题消失,为您的任务创建单独proguard的密钥dev和常规版本。并对除proguard.

于 2012-07-18T16:53:27.270 回答