2015-03-25 7 views
14

Ich bin mir sicher, dass dies schon einmal gefragt wurde, aber ich finde nur nicht die richtigen Schlüsselwörter Antworten zu finden, so ...Wie höre ich Gradle für Android vom Erstellen ab * All * Bibliotheksmodul Build-Typen auf jedem Build?

Wie höre ich Gradle für Android (innerhalb oder außerhalb von Android Studio) aus dem Gebäude alle Build-Typen eines Bibliotheksmoduls, wenn ich Anfrage eine Build-Typ erstellen? IOW, wenn ich debug baue, wie verhindere ich Gradle für Android von auch Gebäude release?


Die Hintergrundgeschichte, für die mit alternativen Ideen:

Angenommen, dass ich zwei Android Studio-Projekte haben, A und B hat jeder zwei Module: ein Android-Bibliothek-Modul und eine Demo-Anwendung, die abhängig auf dieser Bibliothek. Also, ich habe insgesamt vier Module:

  • A L: Projekt A Bibliothek
  • A D: Projekt A die Demo-Anwendung
  • B L: Projekt B Bibliothek
  • B D: Projekt B's Demo App

So lange ein s A und B sind nicht verwandt, das Leben ist gut.

Aber was, wenn ich möchte B L von A L abhängen?

Für release, wenn ich in einer Maven-Stil Artefakt-Repository diese Bibliotheken gehen will, muß ich die release Variante B L auf dem veröffentlichten Artefakt von A L abhängig zu sein. Auf diese Weise hat mein B L POM die richtige Abhängigkeitsinfo.

Für debug, wäre es ideal, wenn B L auf die Arbeitskopie eines L abhängen könnte. Während das Einrichten ein bisschen hacky ist, kann ich es zum Laufen bringen.

Aber dann, wenn ich Sachen A L, wie eine neue Java-Klasse hinzufügen, und ich versuche, es von B L verwendet wird, kann ich nicht bauen. Mein debug Build ist vollkommen in Ordnung AFAICT.Doch obwohl ich wirklich wirklich wirklich nicht jetzt eine release Build tun wollen, Gradle für Android besteht ohnehin eine release bauen auf tun:

$ gradle assembleDebug 
:demo:preBuild UP-TO-DATE 
:demo:preDebugBuild UP-TO-DATE 
:demo:compileDebugNdk UP-TO-DATE 
:demo:checkDebugManifest 
:demo:preReleaseBuild UP-TO-DATE 
:richedit:compileLint 
:richedit:copyReleaseLint UP-TO-DATE 
:richedit:mergeReleaseProguardFiles UP-TO-DATE 
:richedit:preBuild UP-TO-DATE 
:richedit:preReleaseBuild UP-TO-DATE 
:richedit:checkReleaseManifest 
:richedit:prepareReleaseDependencies 
:richedit:compileReleaseAidl UP-TO-DATE 
:richedit:compileReleaseRenderscript UP-TO-DATE 
:richedit:generateReleaseBuildConfig UP-TO-DATE 
:richedit:generateReleaseAssets UP-TO-DATE 
:richedit:mergeReleaseAssets UP-TO-DATE 
:richedit:generateReleaseResValues UP-TO-DATE 
:richedit:generateReleaseResources UP-TO-DATE 
:richedit:packageReleaseResources 
:richedit:processReleaseManifest UP-TO-DATE 
:richedit:processReleaseResources 
:richedit:generateReleaseSources 
:richedit:compileReleaseJava 

(wo richedit ist B L und demo ist B D in meiner Nomenklatur oben)

ich bitte die debug bauen zu montieren, aber es kompiliert noch die release bauen. Und die release Build kann nicht kompilieren, weil ich versuche, B L verwenden, um neue unreleased Sachen von A L zu haben.

Ich bin einigermaßen zuversichtlich, obwohl nicht 100% sicher, dass, wenn Gradle für Android würde einfach ignorieren release, wenn ich versuche zu bauen debug, würde ich in Ordnung sein.

Natürlich gibt es mögliche Abhilfen:

  • Ich konnte die Idee aufgeben, dass diese getrennte Bibliotheken und konsolidieren sie in einem. Ich kann das noch tun. Aber es fühlt sich so an, als würde das, was ich versuche, möglich sein.

  • konnte ich nicht versuchen, die A L Änderungen mit, bis ich ein release A L veröffentlichen, wobei in diesem Fall B L für auf den veröffentlichten Artefakt sowohl debug und release verlassen kann. Dies scheint jedoch eine Menge Patchlevel-Abwanderung im A-Projekt zu verursachen, da mein Hauptverbraucher "Anwendungsfall" dieser neuen A-Funktionalität B ist. Nur weil ich Änderungen an A habe, die Instrumentierungstests bestehen, bedeutet das nicht, dass sie es sind werde was B braucht, und ich werde das nicht wissen, bis ich B mit den Änderungen in A bauen kann.

  • Eine Abwandlung der obigen Problemumgehung kann SNAPSHOT Releases sein, wo ich irgendwie die Überprüfung für SNAPSHOT Releases ermöglichen würde für debug aber nicht für release oder etwas. Allerdings scheint die Mischung aus Maven, Gradle, Android und SNAPSHOT allesamt zu wenig dokumentiert zu sein, und ich habe keine Ahnung, ob es etwas ist, was ich verfolgen sollte. Und wie bei der vorhergehenden Aufzählung würde dies immer noch dazu führen, dass release unnötigerweise gebaut wird; Der Build würde in meinem Fall einfach gelingen.

Gibt es etwas Gradle für Android irgendwo einstellen, dass ich das sagt fehle debug bedeutet nurdebug?

+0

Ich bin mit Gradle nicht versiert, also kann das völliger Unsinn sein: - | - Kannst du das 'Build Variants' Panel öffnen (Ansicht> Tool Windows> Build Varianten) und' debug' für 'richedit' Modul wählen? – Vikram

+1

@Vikram: Das ist, was da ist. Das wiederum bedeutet, dass wenn Sie das Projekt erstellen oder ausführen, es eine AssembledDebug-Aufgabe ausführt und zu den beschriebenen Problemen führt. Ich benutze die Kommandozeile ** 'gradle assembleDebug' ** Aufgabe, um das Gradle Transkript anzuzeigen, aber die Ergebnisse sind die gleichen. Trotzdem danke! – CommonsWare

+1

https://code.google.com/p/android/issues/detail?id=66805#c3 –

Antwort

2

ein Bug Es ist hier: https://code.google.com/p/android/issues/detail?id=52962

Hat Kommentar # 35 d

Versuchen Sie, diese in dem Abhängigkeits Projekt

android { 
    publishNonDefault true 
    ... 
} 

und dies in der Projekteinstellung, die es

verwendet
dependencies { 
    releaseCompile project(path: ':theotherproject', configuration: 'release') 
    debugCompile project(path: ':theotherproject', configuration: 'debug') 
} 

von hier genommen: https://code.google.com/p/android/issues/detail?id=66805

Arbeit für Sie ? Scheint so zu sein, dass die meisten Leute denken, dass ich arbeite, ich habe es noch nicht persönlich ausprobiert.

+0

Sorry, das ändert nichts am Verhalten. Darüber hinaus würde es die POM für den Release-Build brechen, der von dem Artefakt abhängen muss, nicht von einem Peer-Projekt. Trotzdem danke! – CommonsWare

3

https://stackoverflow.com/a/27278352/535762 Wenn Sie Ihr Problem beheben, wäre ich daran interessiert zu wissen, wie, weil es sicher noch nicht voll funktionsfähig ist, um nur mit Debugging-Gaddle-Builds zu verwenden. Hier

die wesentlichen Teile:

In der „Build-Varianten“ Sichtfenster auf der linken Seite, sollten Sie Ihre beiden Module, und neben ihnen die aktuellen „aktiven“ Varianten sehen. Zum Beispiel

app debug 
custom_lib debug 

Build > Make Project 

Bauen jedes Modul in dem Projekt in ihrer aktuellen Variante

https://code.google.com/p/android/issues/detail?id=52962 erfordern die Release-Variante von custom_lib Gebäuden, und so Sie am Ende beider Gebäude.

Verwenden Sie die Option Make Module app. Diese Option wechselt basierend auf der aktuellen Auswahl im Projektfenster oder basierend auf dem aktuellen Editor von App zu Lib und führt immer nur das aus, was zum Erstellen des aktuellen Moduls benötigt wird.

+0

Das zeigt an, dass meine Frage ein Duplikat ist. Ich habe dieses Thema ziemlich aufgegeben, daher erwarte ich nicht, zu testen, ob Xavs Lösung praktikabel ist. Wahrscheinlich ist es das, obwohl Änderungen in Android Studio seit Dezember 2014 Auswirkungen haben könnten. Danke vielmals! – CommonsWare

+0

Oh, tut mir leid für das Fehlen einer klaren Antwort. Ich habe es bearbeitet, um sicherzustellen, dass jeder die wesentlichen Teile sieht. – einschnaehkeee

Verwandte Themen