Introducción a Swift Package Manager

Andres Felipe Ocampo
7 min readJan 20, 2021

--

  1. Introducción
  2. Entorno de trabajo
  3. Creando nuestro paquete
  4. Importanto el paquete en una App de iOS

1. Introducción

Con Swift 3.0, Apple liberó una herramienta muy potente para manejar y gestionar las dependencias de los proyectos del lado del servidor y tambien por línea de comandos nuestro famoso Swift Package Manager. Con la llegada de la version 5 de Swift, Apple introdujo la compatibilidad de esta herramienta con proyectos iOS, MacOS, TvOS además de poder crearlos y configurarlos a través de Xcode. Swift Package Manager nos sirve para automatizar el proceso de descarga, compilación y linkado de las dependencias de un proyecto de forma muchas mas sencilla que las actuales solcuciones de terceros (CocoaPods, Carthage).

1.1.¿Qué son los Swift package?

Los paquetes son básicamente una colección de archivos de código en Swift y un fichero llamado Package.swift que define la configuración del mismo, este fichero contiene información de sus propias dependencias con otras librerías en caso de que las hubiera. Además, los paquetes pueden existir de forma local o de forma remota como un repositorio de git, por lo que podríamos bajarnos un paquete de git, hacernos una copia local, y hacer nuestras propias modificaciones.

Con la versión de Swift 5.3, se incorporan una serie de mejoras muy interesantes a tener en cuenta:

  • Poder añadir librerías binarias, esta característica va a ser la que mate finalmente a Cocoapods, Carthage, o cualquier solución de terceros para el manejo de dependencias, ya que hasta ahora solo podríamos incluir librerías de código fuente (no compiladas).
  • Poder añadir recursos como imágenes, sonido, interfaces… etc, además de soporte de localización en los mismos.
  • Dependencias condicionales que nos van a servir para manejar las dependencias en función a la plataforma de ejecución, esto nos va a servir por ejemplo para importar una dependencia cuando ejecutamos en Mac y otra cuando ejecutamos en iOS.

Vamos a ver un ejemplo de cómo crear nuestro paquete y usarlo desde una aplicación de iOS.

2. Entorno de trabajo

Configuración de mi equipo:

  • Hardware: Portátil MacBook Pro 15′ (2,3 Ghz Intel Core i9 de 8 núcleos, 32GB DDR4).
  • Sistema Operativo: Mac OS Catalina 10.15.7
  • Entorno de desarrollo: Xcode 12.3

3. Creando nuestro Swift package

Vamos a Xcode -> File -> New -> Swift package, y creamos nuestro paquete llamado StringHelperPackage indicamos que genere un repositorio git (esto nos servirá para subir nuestro repositorio más adelante y con trucos).

Una vez creado el proyecto tenemos la siguiente estructura de carpetas:

En la carpeta Sources es donde vamos a incluir los ficheros que formen parte de nuestra librería,en caso de que vayamos a crear distintos targets, por convención tendríamos que crear una segunda carpeta, al igual que se hace con la capeta de Test (que es un target independiente).

El fichero Package.swift es el «manifiesto» de lo que contiene nuestro paquete, aquí es donde indicamos las librerías que va a generar y las dependencias y targets que tiene, veámoslo en detalle:

En primer lugar indicamos el nombre del paquete, a continuación, pasamos un array de products que van a ser los ejecutables o librerías que va a generar.

En el parámetro dependencies vamos a añadir las dependencias de nuestro paquete, que a su vez pueden tener dependencias de otros, esto lo va a gestionar todo de forma automática Swift Package Manager. De cara a añadir las dependencias tenemos distintas funciones disponibles:

Desde una versión específica: (instalará una versión superior si la hubiera):

.package(url: "https://foo.com/...", from: "1.1")

Especificar una versión concreta:

.package(url: "https://foo.com/...", .exact("1.2"))

Especificar una rama concreta:

.package(url: "https://foo.com/...", .branch("Development"))

También es posible especificar un hash:

.package(url: "https://foo.com/...", .revision("33hbv23m2l323k4256n4mmj45h4b"))

Por último en el array de targets vamos a definir los targets que va a tener nuestro paquete.

Si queremos especificar una plataforma y versión mínima requerida por nuestro paquete, bastaría con añadir este fragmento de código:

3.1. Añadiendo funcionalidad

Venga vamos al fichero StringHelperPackage.swift y lo dejamos de la siguiente forma, vamos a tener que especificar como public aquellas funciones que queramos que sean accesible:

Estas son una par de funciones que hemos creado para la prueba de este tutorial. También nos vamos al fichero StringHelperPackageTest y lo cambiamos para que los test prueben nuestro código:

3.2 Publicación de nuestro Swift Package

Ya tenemos hecho un paquete con una funcionalidad mínima, es hora de subirlo a git, vamos a la barra de menú de Xcode y en Source Controlo hacemos un commit de los cambios realizados:

Como hace parte de nuestro día a día vamos a subir nuestro proyecto a GitHub, ahora si no tienes aún una cuenta, es el momento para comenzar, también puedes hacerlo con BitBucket o GitLab, son gratuitas, asi que aprovecha.

Como sabes podemos enganchar GitHub con el Xcode, para hacerlo tenemos que hacerlo a través de las preferencias de Xcode y en el apartado de cuentas, añadimos nuestra cuenta de GitHub o GitLab.

Seguro vas a tener algunos problemas con la conexión, así que te pongo algunos enlaces de interes como la documentación de GitHub para crear un token personal aquí

Una vez configurada la cuenta de vamos a la pestaña de Xcode de control de Código (Cmd+2) en el panel de la izquierda y pulsamos ccon el boton derecho sobre nuestra rama, y se desplegará un menú y pulsamos en la opcion de New Remote

Nos pedirá que seleccionemos la cuenta, el propietario, el nombre y la descripción, además de indicar si el repositorio va a ser público o privado, es este caso seleccionaremos público:

Tardará unos segundos en crearla y una vez terminado el proceso ya tenemos nuestro paquete subido al repositorio.

Pero aún nos falta un detalle importante, todos nuestros paquetes han de tener un tag identificando la versión en la que se encuentran, para hacer esto vamos a pulsar con el botón derecho del ratón sobre nuestro commit y vamos a pulsar sobre «Tag…»:

Nos va a pedir el Tag, que al ser nuestra primera versión escribimos «1.0.0», opcionalmente podremos indicar un comentario:

Una vez hecho, tenemos que subir al repositorio nuestro tag, pulsamos en la barra de menús el botón Source Control -> Push, no olvides seleccionar el checkbox de «Include tags»:

Y listo, ¡ya tenemos nuestro paquete etiquetado con su versión 1.0.0 en el repositorio listo para usar!

4. Importando el paquete en una App de iOS

Ahora vamos a probar nuestro paquete en una aplicación iOS. En Xcode vamos a crear una aplicación iOS de tipo Single View a la que llamaremos TestPackage:

Ahora vamos a importar nuestro paquete, para ello, debemos obtener la url del mismo, esta la vamos a encontrar en GitHub pulsando el botón «Clone or Download»:

Pegamos la url en nuestro portapapeles y nos vamos al menu Xcode -> File -> Swift Packages -> Add Package Dependency:

Ahora pegamos nuestra dirección y pulsamos Next:

Nos pedirá que especifiquemos una número de versión, una rama o un commit específico, nosotros vamos a seleccionar la versión 1.0.0 que es la que hemos etiquetado anteriormente:

Si pulsamos en Next se hace la importación y ya podemos ver en nuestro árbol nuestra dependencia creada:

Ahora vamos a nuestro ViewController y escribimos lo siguiente:

¡Hemos terminado! ya tenemos los conocimientos necesarios para crear nuestro propios paquetes e importarlos en nuestros proyectos de Xcode.

Por fin, los desarrolladores de aplicaciones iOS tenemos una herramienta que funciona de forma limpia, rápida y cómoda para importar nuestras dependencias, y todo incorporado de forma nativa en el IDE.

Una lista de las librerías Open Source que tiene ya soporte para Swift Package Manager aquí venga a disfrutar.

--

--

Andres Felipe Ocampo
Andres Felipe Ocampo

Written by Andres Felipe Ocampo

Digital Manager and Sr Lead iOS Engineer

No responses yet