2012-09-07 18 views
7

Hay un código que quiero incluir en la mayoría de mis proyectos. Cosas como AFNetworking, categorías para CoreData y pruebas unitarias, etc.¿Vale la pena crear bibliotecas estáticas para iOS?

Parece lógico incluir todo esto en una biblioteca estática, y luego usarlo en cada proyecto. Sin embargo, he notado que muchas bibliotecas de terceros (como AFNetworking y su predecesor ASIHTTP) se incluyen en los proyectos al copiar todos sus archivos fuente y luego vincular manualmente las bibliotecas necesarias al objetivo del proyecto.

Esto me parece la manera más fácil. Tomó bastante tiempo descubrir cómo incluir una biblioteca estática existente en un proyecto. Incluso después de saber cómo, todavía parece un dolor hacerlo en cada nuevo proyecto. Además, las rutas de búsqueda de encabezado que especifique se encuentran en un directorio local con los archivos de la biblioteca estática. ¿No sería más fácil y existe una forma de copiar los archivos de la biblioteca estática en el proyecto? Esta es la misma idea que incluir los archivos de clase directamente como la mayoría de las bibliotecas parece que ya lo hacen, pero sería más organizado porque todo se agruparía en un proyecto de biblioteca, en lugar de tener archivos de clase en todas partes y tener que incluir cada uno de ellos.

Las bibliotecas estáticas sienten que deberían ser el camino correcto. Haga una biblioteca que se pueda usar con todos los proyectos que incluyen clases que todo proyecto necesitará. Tiene sentido. Simplemente estoy en conflicto porque parece que el camino correcto es dejar todo fuera de una biblioteca 'formal', y simplemente copiar todos los archivos de la clase.

Supongo que solo estoy buscando lo que los desarrolladores experimentados consideran la mejor opción.

+0

Hay una buena discusión sobre la construcción de su propio "marco estático" en (Cocoanetics) [http://www.cocoanetics.com/2010/05/making-your-own-iphone-frameworks-in-xcode/] . –

+0

@JodyHagins Error 404 - No encontrado – ma11hew28

+0

http://www.cocoanetics.com/2010/04/universal-static-libraries/ y http://www.cocoanetics.com/2010/05/making-your-own- iphone-frameworks-in-xcode/ –

Respuesta

7

Sería de los primeros en admitir que el proceso de hacer referencia a una biblioteca estática en Xcode no es del todo intuitivo. Sin embargo, usar una biblioteca estática es la mejor opción, sin lugar a dudas.

La razón principal es la capacidad de mantenimiento: cuando copia el código fuente de una biblioteca en muchos lugares, debe recordar actualizarlos todos al último código cuando actualice a la próxima versión de la biblioteca. Esto puede ser un proceso bastante propenso a errores, especialmente cuando la fuente de la biblioteca subyacente cambia de forma significativa (por ejemplo, se añaden nuevos archivos, archivos viejos se cambia el nombre, etc.)

+0

Ok. Entonces, digamos que creo un proyecto y agrego mi biblioteca estática a él. Cambio la ruta de búsqueda de encabezados para que esté donde esté la biblioteca estática en mi máquina y todo está bien. Pero, ¿y si hay muchos desarrolladores trabajando en el proyecto? ¿No significaría esto que cuando revisen mi proyecto, necesitarán mi biblioteca estática en el mismo directorio relativo que yo tenía? –

+0

@LoganSerman Una solución estándar para esto es usar un repositorio para dependencias binarias externas. La solución más simple que he visto utilizar en múltiples compañías es verificar los artefactos binarios de su biblioteca en un lugar separado en su control de origen, por ejemplo, una carpeta 'external/lib_afn/ver1.23 /'. Ahora todos revisan esa carpeta en el mismo lugar en su sistema de archivos, y la referencia que configura en su máquina se vuelve válida para todos. – dasblinkenlight

+0

Entonces, si las bibliotecas estáticas están en una ubicación separada, ¿qué significa esto cuando se compila y publica la aplicación final? Tiene que incluir los archivos de la biblioteca estática, ¿verdad? ¿Aunque los archivos son externos? –

0

yo estaría de acuerdo en que las bibliotecas estáticas sienten que podrían ser la correcta camino a seguir por una serie de razones, pero también puede presentar algunos problemas.

Lo positivo sería crear una manera fácil de agregar una biblioteca a un proyecto. Aunque no es completamente intuitivo, es bastante trivial agregar una biblioteca estática a un proyecto después de hacerlo varias veces. Agregue los archivos, agregue la ruta de búsqueda, listo. Esto también podría ser útil en ciertas situaciones de control de fuente. Además, actualizar una biblioteca puede ser más fácil.

Creo que el verdadero problema aquí es para la comunidad de código abierto. Al incluir, por ejemplo, AFNetworking, como una biblioteca estática, pierde todo el acceso a los archivos de implementación. Esta es una gran característica de incluir fuente en lugar de una biblioteca. Le permite cambiar el código a la forma que mejor le parezca y, con suerte, a devolverlo.

+0

No, puede agregar una biblioteca estática e incluir los archivos fuente incluyéndolo como una referencia cruzada de proyecto o como otro proyecto de un área de trabajo. Ver [@ deanWombourne's answer] (http://stackoverflow.com/a/12320743/242933). – ma11hew28

3

Hay una solución intermedia: realice un proyecto XCode que construya su biblioteca estática desde el origen y la ponga en un repositorio compartido (es decir, submódulo git, etc.) que se incluye desde el repositorio principal de cada proyecto.

Cada uno de sus proyectos incluiría este submódulo y proyecto. Luego obtienen el último código fuente cada vez que extraen ese submódulo. Si configura esto como una dependencia de compilación, construirá una biblioteca estática la primera vez que compile y, a continuación, XCode es lo suficientemente inteligente como para incluirla en cada compilación posterior, de modo que obtenga el beneficio de tiempos de compilación rápidos.

También tiene la ventaja de tener la fuente allí para avanzar/depurar.

Si se trata de un proyecto separado de XCode y una nueva versión de una biblioteca agrega o elimina un archivo fuente, solo necesitaría cambiar ese proyecto compartido; todos sus proyectos individuales no cambiarían en absoluto.

1

¿Qué hay de usar CocoaPods? Esta herramienta hace exactamente lo que quiere de manera declarativa: tiene un archivo (Podfile) donde declara sus dependencias, y la herramienta descarga todas las dependencias y crea una biblioteca estática que se agrega a su proyecto.