我正在尝试为使用Jan Berkel's Android Plugin的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
))
似乎最后添加的内容总是涵盖了之前的那些内容。 有谁知道这个解决方案?
答案 0 :(得分:1)
这个问题需要一些额外的信息。
以下是完整的源代码:https://github.com/ioreskovic/android-plugin
显然,您已将settings
从AndroidInstall
复制到AndroidFastInstall
中的devSettings
。然后,您在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
。)
要更好地理解这一点,您必须了解实际的设置和任务以及它们的工作原理:
https://github.com/harrah/xsbt/wiki/Getting-Started-Basic-Def
https://github.com/harrah/xsbt/wiki/Getting-Started-More-About-Settings
https://github.com/harrah/xsbt/wiki/Getting-Started-Custom-Settings
有关如何声明任务键的示例,请参阅“定义键”。
有关如何实施任务的示例,请参阅“实施任务”和“基于其他键计算值”:&lt;&lt; =&lt; =&lt; =
它的要点是 - 首先通过:=
和<<=
声明并实施任务键。可以多次调用<<=
- 每次调用<<=
都会重新执行任务键。
要解决您的问题,请为proguard
和常规版本的任务创建单独的dev
键。对proguard
以外的冲突任务执行相同的操作。