2011-09-19 13 views
6

Necesito ayuda para encontrar la mejor forma (o la mejor práctica) para organizar mi proyecto de Android. Por simplicidad, digamos que mi área de trabajo de Eclipse para Android es C:\Android\Projects\. Dentro de esa carpeta me gusta separar las aplicaciones de las bibliotecas y tengo otras dos carpetas, C:\Android\Projects\Applications y C:\Android\Projects\Components.¿Cómo debo organizar el control de código fuente para proyectos de Android, incluidas las bibliotecas?

Para un proyecto que he clonado a partir de una biblioteca de GitHub en la carpeta Components, digamos C:\Android\Projects\Componentes\SampleLib (dentro de esa carpeta hay dos carpetas TheLib y TheLibExample). Y mi aplicación se creó en C:\Android\Projects\Applications\MyTestApp. Luego incluí la biblioteca en la aplicación al seguir these instructions.

Ahora digamos que quiero usar GitHub para compartir mi aplicación con la comunidad de código abierto. Crearé un repositorio e insertaré todo desde C:\Android\Projects\Applications\MyTestApp en algún repositorio.

Si alguien quiere bifurcar mi aplicación o incluso ayudarme, necesitará la biblioteca para compilarla y ejecutarla, lo cual no está incluido en mi proyecto. El archivo default.properties tendrá algo así como android.library.reference.1=../Components/SampleLib/TheLib y alguien tendrá que clonar manualmente esa biblioteca también y él tendría que colocarla en la misma ruta relativa, de lo contrario, se arruinaría el control de fuente de mi aplicación.

La única manera que puedo pensar en la solución de este problema consiste en organizar mi espacio de trabajo de la siguiente manera:

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

Y mi repositorio debe ser llenado con el contenido de C:\Android\Projects\Applications\MyTestApp\.

Pero, ¿qué ocurre cuando se actualiza la biblioteca? No puedo simplemente extraer los nuevos cambios, necesito copiarlos en la carpeta TheLib. En la organización de carpetas anterior esto no sería necesario ya que estaba haciendo referencia al repositorio clonado original y no a una copia.

¿Qué debo hacer entonces? ¿Debo ir con la opción uno y permitir que cualquiera que forking mi proyecto se ocupe de la dependencia de la biblioteca como lo consideren apropiado, o debería ir con la segunda y darles más trabajo a todos manteniendo dos carpetas sincronizadas cuando la original extrae los cambios de la ¿repositorio?

+0

¿Cómo resolvió este problema para bitbucket? bitbucket no agrega mi biblioteca en el proyecto – Erum

Respuesta

4

Quizás los submódulos de Git resuelvan su problema.

+0

Un poco confuso de usar esos. Tendré que cavar más profundo en el futuro, por ahora solo dejo las cosas como están. Pero creo que los submódulos son exactamente lo que estaba buscando :) –

+0

Los submódulos de Git son muy confusos y en mi opinión demasiado complicados para su caso. Por lo que he leído, los submódulos se recomiendan cuando desea incluir una biblioteca de terceros, que actualizará con poca frecuencia (solo cuando haya otra versión). No funcionan bien con su propia biblioteca, que actualizaría a menudo. Quizás quieras probar el subárbol de git: http://apenwarr.ca/log/?m=200904#30 –

1

Personalmente, creo que el proyecto de la biblioteca de Android es un diseño FAIL. Es ridículo que la única forma en que deseo referirme/usar otra pieza de código es obtener otro proyecto completo y configurar todo en el nivel de configuración IDE. ¿Qué es una biblioteca? debe ser un componente reutilizable compilado y empaquetado en un formato de archivo. De acuerdo con su nota importante Library project storage location, no creo que haya una solución fácil que podamos romper el vínculo y administrar la biblioteca como una biblioteca real. Si su biblioteca no está tan androidizada, intente escribir/compilar como una biblioteca de archivos jar simple y use Maven para gestionar la compilación/versión de la biblioteca jar y las dependencias de proyectos.

Hmmm, es razonable que Google lo llama Android Biblioteca Proyecto, no Android Biblioteca.

+0

Estoy de acuerdo con usted en la configuración completa de otro proyecto. Viniendo de Windows/C# donde puedo simplemente hacer referencia a un archivo .dll y ahora no puedo hacer algo similar en Android. Aún así, tu respuesta realmente no responde mi pregunta. Y la biblioteca no es mía, es de otra persona. Honestamente, no sé lo que es Maven y no puedo molestarme en aprender algo nuevo en este momento. –

+0

Sé que esto no es una respuesta, intenté agregarlo como un comentario, pero el tamaño se desbordó: P – yorkw

+1

Hay una diferencia muy importante entre un Android Library Project y una biblioteca que conoces de Java, donde solo tienes un jar. La diferencia es que el Proyecto de Biblioteca no solo se copia en el proyecto principal. Para guardar el tamaño del disco, solo las partes usadas se copian y se compilan en el proyecto principal. Además, los recursos se pueden cambiar fácilmente en el proyecto principal, ya que simplemente reemplazan las cosas de la biblioteca. Perfecto para aplicaciones de etiqueta blanca! Si no te gusta, puedes desarrollar una biblioteca y agregarla como un contenedor a tu proyecto. Por favor, no compare una manzana con un plátano! – WarrenFaith

1

Personalmente creo que los submódulos de git no proporcionan por completo un sistema potente y fácil de usar para las dependencias de la biblioteca.

Los subárboles de Git son una mejor alternativa. Encontré a very useful guide que explica cómo hacerlo.

Básicamente se puede crear una subcarpeta que contiene sus dependencias, y repositorios clon dentro de esa subcarpeta:

$ 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/" 

A continuación, tendrá la de este ejemplo dos repos/libs dentro vendor/; solo necesita agregarlos a su IDE/sistema de compilación.

Las ramificaciones y modificaciones de Git son mucho más sencillas y directas que con los submódulos.

Incluso he creado a small script que automatiza este proceso para obtener una lista de libs.

Cuestiones relacionadas