2011-09-19 5 views
6

Ho bisogno di un piccolo aiuto per capire il modo migliore (o migliore pratica) per organizzare il mio progetto Android. Per semplicità, diciamo che il mio spazio di lavoro Eclipse per Android è C:\Android\Projects\. All'interno di questa cartella mi piace separare le applicazioni dalle librerie e ho altre due cartelle, C:\Android\Projects\Applications e C:\Android\Projects\Components.Come dovrei organizzare il controllo del codice sorgente per i progetti Android comprese le librerie?

Per un progetto che ho clonato una libreria da GitHub nella cartella Components, diciamo C:\Android\Projects\Componentes\SampleLib (all'interno della cartella ci sono due cartelle TheLib e TheLibExample). E la mia app è stata creata in C:\Android\Projects\Applications\MyTestApp. Quindi ho incluso la libreria nell'app seguendo il numero these instructions.

Ora diciamo che voglio usare GitHub per condividere la mia app con la comunità open source. Creerò un repository e trasferirò tutto da C:\Android\Projects\Applications\MyTestApp in qualche repository.

Se qualcuno vuole bifare la mia app o addirittura aiutarmi, avrà bisogno della libreria per compilarla ed eseguirla, che non è inclusa nel mio stesso progetto. Il file default.properties avrà qualcosa come android.library.reference.1=../Components/SampleLib/TheLib e che qualcuno dovrà clonare manualmente anche quella libreria e che dovrà collocarlo nello stesso percorso relativo, altrimenti rovinerebbe il controllo del codice sorgente per la mia app.

L'unico modo che posso pensare di risolvere questo problema è quello di organizzare il mio lavoro in questo modo:

C:\Android\Projects\Applications\MyTestApp\TheApp 
C:\Android\Projects\Applications\MyTestApp\TheLib 
C:\Android\Projects\Componentes\SampleLib 

E il mio repository deve essere riempito con il contenuto da C:\Android\Projects\Applications\MyTestApp\.

Ma cosa succede quando la libreria viene aggiornata? Non posso semplicemente inserire le nuove modifiche, ho bisogno di copiarle nella cartella TheLib. Nella precedente organizzazione della cartella questo non sarebbe stato necessario poiché stavo facendo riferimento al repository clonato originale e non a una copia.

Cosa devo fare allora? Dovrei andare con l'opzione uno e lasciare che chiunque bifichino il mio progetto si occupi della dipendenza della libreria come meglio crede, o dovrei andare con la seconda e dare a tutti più lavoro mantenendo sincronizzate due cartelle quando quella originale estrae le modifiche dal suo repository?

+0

come hai risolto questo problema con bitbucket? bitbucket non aggiunge la mia libreria nel progetto – Erum

risposta

4

Forse i sottomoduli git risolveranno il problema.

+0

Un po 'di confusione per usare quelli. Dovrò scavare più a fondo nel futuro, per ora sto semplicemente lasciando le cose come sono. Ma immagino che i sottomoduli siano esattamente ciò che stavo cercando :) –

+0

I sottomoduli Git sono molto confusi e secondo me troppo complicati per il tuo caso. Da quello che ho letto i sottomoduli sono raccomandati quando vuoi includere una libreria di terze parti, che aggiornerai raramente (cioè solo quando c'è un'altra versione). Non funzionano bene con la tua libreria, che aggiorneresti spesso. Potresti voler provare git subtree invece: http://apenwarr.ca/log/?m=200904#30 –

1

Personalmente penso che il progetto di libreria di Android sia un progetto FAIL. È ridicolo che l'unico modo in cui voglio riferire/utilizzare un altro pezzo di codice è ottenere un altro intero progetto e impostare tutto a livello di configurazione IDE. cos'è una biblioteca? dovrebbe essere una componente riutilizzabile compilata e confezionata in un formato di archivio. In base alla loro importante nota Library project storage location, non penso ci sia una soluzione facile che possiamo rompere il legame e gestire la libreria come una vera libreria. Se la tua libreria non è così androidizzata, prova a scrivere/compilare come una semplice libreria jar e usa Maven a gestire la build/release della libreria jar e le dipendenze del progetto.

Hmmm, è ragionevole che Google chiamano Android Biblioteca Progetto, non Android Biblioteca.

+0

Sono d'accordo con te sull'intera configurazione di un altro progetto. Venendo da Windows/C# dove posso solo fare riferimento a un file .dll e ora non posso fare qualcosa di simile in Android. Tuttavia, la tua risposta in realtà non risponde alla mia domanda. E la biblioteca non è mia, è di qualcun altro. Onestamente non so cosa sia Maven e non posso essere disturbato a imparare qualcosa di nuovo al momento. –

+0

So che questa non è una risposta, stavo tentando di aggiungerla come commento ma la dimensione è in overflow: P – yorkw

+1

C'è una differenza molto importante tra un progetto di libreria Android e una libreria che conosci da Java, dove hai solo un barattolo. La differenza è che il Progetto Biblioteche non è solo copiato nel progetto principale. Per salvare le dimensioni del disco, solo le parti utilizzate vengono copiate e compilate nel progetto principale. Inoltre, le risorse possono essere modificate facilmente nel progetto principale, in quanto sostituiscono solo le cose della biblioteca. Perfetto per le app di white label! Se non ti piace, puoi comunque sviluppare una libreria e aggiungerla come un vaso al tuo progetto. Si prega di non confrontare una mela con una banana! – WarrenFaith

1

Personalmente penso che i sottomoduli git non forniscano completamente un sistema molto facile da usare e potente per le dipendenze delle librerie.

I substudi Git rappresentano un'alternativa migliore. Ho trovato a very useful guide che spiega come farlo.

In pratica è possibile creare una sottocartella che contiene le dipendenze, e repository clone all'interno che sottocartella:

$ mkdir vendor 
$ git remote add -f ABS https://github.com/JakeWharton/ActionBarSherlock 
$ git merge -s ours --no-commit ABS/master 
$ git read-tree --prefix=vendor/ABS/ -u ABS/master 
$ git commit -m "Merged ABS into vendor/ABS/" 
# Now another lib 
$ git remote add -f Crouton https://github.com/keyboardsurfer/Crouton 
$ git merge -s ours --no-commit Crouton/master 
$ git read-tree --prefix=vendor/Crouton/ -u Crouton/master 
$ git commit -m "Merged Crouton into vendor/Crouton/" 

Poi, avrete la in questo esempio due repository/librerie all'interno vendor/; hai solo bisogno di aggiungerli al tuo IDE/sistema di costruzione.

La ramificazione di git e le modifiche sono molto più semplici e più semplici rispetto ai sottomoduli.

Ho anche creato a small script che automatizza questo processo per un elenco di librerie.