Swift Package Manager – Instalación y Primeros Pasos

En esta ocasión aprenderemos sobre Swift Package Manager, el gestor de paquetes oficial del projecto Swift.

Con SPM (Swift Package Manager) podemos crear paquetes, ya sean librerías o ejecutables, gestionar las dependencias de estos y en general administrar de una manera más fácil y consensuada la distribución de nuestro código Swift.

Visión conceptual

Antes de entrar en materia repasaremos ciertos conceptos básicos manejados en este artículo relacionados con la funcionalidad del Swift Package Manager.

Módulos

Swift organiza el código en módulos. Cada módulo especifica un espacio de nombres e impone controles de acceso sobre qué partes de ese código se pueden usar fuera del mismo. Un programa puede tener todo su código en un solo módulo, o puede importar otros módulos como dependencias.

Además del puñado de módulos proporcionados por el sistema, como Darwin en macOS o Glibc en Linux, la mayoría de las dependencias requieren que el código se descargue y construya para poder ser utilizado.

Cuando hacemos uso del código de un módulo para resolver un problema este no está limitado a un caso en particular, por el contrario este módulo o librería externa se puede reutilizar en otras situaciones. Por ejemplo, un módulo que nos ayuda con las peticiones de red se puede compartir entre una aplicación para compartir fotos y una aplicación de clima.

El uso de módulos nos ayuda a agilizar los tiempo de desarrollo, permitiendo construir nuestro proyecto (o ciertas áreas de este) sobre el código bien escrito (en la mayoría de los casos) de otros desarrolladores en lugar de volver a implementar la misma funcionalidad nosotros mismos y perder un tiempo precioso para al final, muchas veces, ni siquiera obtener un mejor desempeño.

Paquetes

Un paquete consta de archivos fuentes y un archivo de manifiesto. El archivo de manifiesto, llamado Package.swift, define el nombre del paquete y su contenido utilizando el módulo PackageDescription. Un paquete cuenta con uno o más targets (objetivos). Cada target especifica un producto y puede declarar una o más dependencias.

Productos

Mediante un target podemos especificar un producto, ya sea una librería o un ejecutable. Una librería contiene un módulo que puede ser importado por otro código Swift y un ejecutable es un programa que puede ejecutar el sistema operativo.

Dependencias

Las dependencias de un target son módulos requeridos por el código del paquete. Una dependencia consiste en una URL relativa o absoluta que apunta al origen del paquete así como un conjunto de requisitos para la versión compatible del paquete que podemos usar en nuestro proyecto.

El rol de Package Manager es reducir los costos de coordinación al automatizar el proceso de descarga y creación de todas las dependencias para un proyecto.

Esto resulta en la mayoría de las veces en un proceso recursivo: una dependencia puede tener sus propias dependencias, cada una de las cuales a su vez también pueden tener otras más, formando un árbol de dependencias, que gestionar a mano sería extremadamente engorroso.

Por esta razón es que Package Manager nos ayuda con la descarga e instalación de todo lo necesario para satisfacer el árbol de dependencias.

¿Qué es el super comando swift?

Mediante el comando swift ejecutamos la gran mayoría de nuestras acciones. Muchas veces se confunde con Swift REPL (Read Eval Print Loop) ya que si lo ejecutas sin parámetros entra por defecto en este modo. Pero hagamos una pausa y responsamos la siguiente pregunta primero:

¿Qué es Swift REPL?

Swift REPL es un modo del comando swift que a su vez nos brinda la funcionalidad de un interprete interactivo de instrucciones Swift, traduciendo las siglas sería algo como: Ciclo de Lectura , Evaluación e Impresión. Pero al mismo tiempo mediante Swift REPL también podemos a su vez acceder al depurador LLDB para tareas más que evidentes. Pasemos a la terminal para ejemplificar lo que acabo de comentar:

Probando Swift REPL
Probando swift REPL

En esta imagen vemos la ejecución del modo Swift REPL del comando swift en Ubuntu (en macOS es similar). Podemos constatar como las instrucciones que pasamos son leídas (Read) e interpretadas (Eval) para al final mostrarnos la respectiva salida en pantallas (Print), tal y como también se observa pudiéramos seguir escribiendo (Loop) hasta que decidamos salir con la opción :q (al estilo vi / vim).

Respondiendo a la primera pregunta: Cuando observamos todo el panorama nos percatamos que con el comando swift podemos hacer muchas cosas, es como un meta-comando lleno de funcionalidades y hasta un modo interactivo. Por esta razón lo he llamado el super comando swift, en la ayuda funge como «Swift Compiler» (Compilador Swift) pero el que realmente compila el código fuente es el comando swiftc.

Este comando (swift) viene siendo como una interfaz a nivel de terminal desde la cual (como ya comenté) podemos entrar en el modo interactivo de Swift REPL, podemos compilar o interpretar un archivo, y también podemos acceder a Package Manager.

Si en alguna de estas capturas te preguntas que interprete de comandos estoy usando o como instalar cierta herramienta que uso y que no viene por defecto pues te invito a leer nuestro artículo sobre la configuración de un entorno de desarrollo Swift (iOS, macOS, tvOS y watchOS) en sistemas macOS.

Conociendo la versión instalada

Siempre es útil conocer la versión de Swift que tenemos instalada y esto lo conseguimos ejecutando el siguiente parámetro sobre el super comando swift. En la terminal de macOS ejecutemos lo siguiente:

$ swift -version

obtenemos la siguiente salida en pantalla:

Apple Swift version 5.1.2 (swiftlang-1100.0.278 clang-1100.0.33.9)
Target: x86_64-apple-darwin19.0.0

Como deben de imaginar el comando swift se instala en el sistema junto a Xcode.

En el caso de Linux hay que seguir algunos pasos que ya hemos descrito en nuestra guía sobre la instalación del lenguaje Swift en sistema Linux.

Obteniendo ayuda

Un comando con tantas opciones resulta bien confuso, así que junto a opciones como este propio artículo y recursos similares como la documentación oficial de Apple y del proyecto Swift, también contamos con una documentación propia del comando.

Una lista y descripción de los parámetros que podemos pasar sobre este nuestro super comando swift. Para acceder a este modo ejecutemos en la terminal el parámetro -help:

swift -help

Luego de ejecutar el comando vemos que la salida en pantalla no cabe en el marco de la terminal, así que lo ejecutaremos de esta otra manera haciendo un pipeline redirigiendo el flujo de la salida del comando hacia less:

swift -help | less

Ahora nos podemos desplazar por la documentación mediante las flechas de arriba y abajo del teclado y salimos presionando la tecla q;

Scripting

Luego de leer la documentación tendremos una mejor idea de todo cuanto podemos hacer con este comando, entre ellas la lectura de un archivo externo o la creación de un script y esto lo podemos probar de una manera bien sencilla. Creemos un archivo:

touch test.swift

luego lo abrimos y le añadimos la siguiente línea:

print("\n¡Hola, te saludo desde un script!")

salvamos y pasamos este archivo fuente al comando swift, de esta manera:

swift ./test.swift

la salida en pantalla sería:

¡Hola, te saludo desde un script!

¿Acaso podemos crear un script al clásico estilo Bash o Python?

La respuesta es sí, modifiquemos el archivo fuente anterior a la siguiente versión:

#!/usr/bin/swift

import Foundation

func fibonacci(of number: Int) -> Int {

    if number <= 2 {

        return 1

    } else {

        return fibonacci(of: number - 1) + fibonacci(of: number - 2)

    } // else

} // fibonacci

func showErrorMessage() {

    print("\n\u{001B}[0;31mERROR: \u{001B}[0;0mTenías que haber escrito un número.")

    goodby()

} // showErrorMessage

func goodby() {

    print("\n¡Adios!")

} // goodby

print("\nInserta un número: ", terminator: "")

let inputStream = readLine()

guard let presumedNumber = inputStream else {

    exit(-1)

} // guard

if presumedNumber.isEmpty {

    showErrorMessage()

    exit(-1)

} // if

guard let number = Int(presumedNumber) else {

    showErrorMessage()

    exit(-1)

} // guard

let result = fibonacci(of: number)

print("\nEl fibonacci de \(number) es \(result)")

goodby()

Salvamos el archivo y en la terminal le damos permisos de ejecución:

chmod +x ./test.swift

luego de esto ya lo podemos ejecutar:

Probando un script en Swift
Probando un script en Swift.

Puedes copiar el comando anterior aquí:

./test.swift

En este punto ya tenemos un script programado en Swift que podemos instalar en nuestro ordenador personal (o servidor) para automatizar ciertas tareas.

Conclusiones

Swift Package Manager es una herramienta bien completa (aún no lo hemos visto todo) que viene a cubrir esos vacíos que teníamos con CocoaPods o Carthage, y cada vez funciona mejor.

Swift es un lenguaje de propósito general y necesita de herramientas como el comando swift y Swift Package Manager para servir a los disímiles escenarios en los que nos encontramos los desarrolladores.

Uno de estos escenarios es aquel donde reutilizamos código a través de librerías, ya no mediante aquellos ficheros .dll de Windows. Hoy día y en el mundo Swift lo hacemos mediante paquetes creados con Swift Package Manager, por eso te decía que aún no lo habíamos visto todo.

Visita el link anterior y aprende mucho más sobre Swift Package Manager.

Falta aún mucho por aprender en nuestro camino a convertirnos en iOS Developer. Suscríbete a nuestra lista de correo y síguenos en nuestras redes sociales. Mantente al tanto de todas nuestras publicaciones.

Espero que todo cuanto se ha dicho aquí, de una forma u otra le haya servido de aprendizaje, de referencia, que haya valido su preciado tiempo.

Este artículo, al igual que el resto, será revisado con cierta frecuencia en pos de mantener un contenido de calidad y actualizado.

¡Cualquier duda o sugerencia, ya sea errores a corregir o ejemplos a añadir, será más que bienvenida, necesaria!

Deja una respuesta

Su dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Este sitio web utiliza cookies para mejorar su experiencia. Asumiremos que está de acuerdo con esto, pero puede optar por no participar si lo desea. Aceptar Leer Más

RECIBE CONTENIDO SIMILAR EN TU CORREO

RECIBE CONTENIDO SIMILAR EN TU CORREO

Suscríbete a nuestra lista de correo y mantente actualizado con las nuevas publicaciones.

Se ha suscrito correctamente!