2012-07-13 14 views
4

我正試圖擴展Jan Berkel's Android PluginScala,它使用SBT如何在SBT中爲Jan Berkel的Android插件添加更多類似的任務和設置?

我有類似的操作和設置,如已定義android:install-deviceandroid:install-emulator
讓他們被稱爲android:dev-install-deviceandroid:dev-install-emulator。在AndroidLaunch.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") 

我還添加東西:

我在AndroidKeys.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 
    )) 

的問題是,如果我想我自己的任務是可用的,我有評論出我不想要的原始的,標準的。

有什麼我可以忽略的嗎?


更新:
我試過不同的順序設置。

AndroidFastInstallAndroidInstall之前,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 
    )) 

AndroidInstallAndroidFastInstall之前,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

這個問題需要一些額外的信息。

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

顯然,您複製從AndroidInstallsettingsdevSettingsAndroidFastInstall。然後您在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 <<< 

此處您正在重新定義名爲proguard的任務鍵,其中dev-install-deviceinstall-device都依賴於此鍵。第一個proguardTask方法在AndroidFastInstall,第二個在AndroidInstall,它們做不同的事情。由於你最後一次稱呼第二個,它重新定義了proguard任務的含義。

(我提請大家注意這兩者dev-install-deviceinstall-device傳遞地取決於proguard任務的關鍵,但在settingsdevSettings這樣的任務鍵的其他例子。)

爲了更好的理解,你有明白了什麼設置和任務真的是和它們是如何工作:

請參閱 「定義鍵」 爲如何聲明一個任務關鍵的例子。

有關如何實施任務的示例,請參閱「實施任務」和「基於其他鍵計算值」:< < =「。

它的要點是 - 任務鍵首先通過:=<<=進行申報和實施。 <<=可能會被多次調用 - 每次調用<<=都會重新實現任務密鑰。

要使問題消失,請爲dev和您的任務的常規版本創建單獨的proguard鍵。對於除proguard以外的其他衝突任務,請執行相同的操作。

+0

是的,就是這樣。 :d – Lopina 2012-07-19 09:54:08

相關問題