Un repositorio de software , o repositorio para abreviar, es una ubicación de almacenamiento para paquetes de software . A menudo también se almacena una tabla de contenidos, junto con metadatos. Un repositorio de software normalmente lo gestiona el control de versiones o de código fuente , o los administradores de repositorio. Los administradores de paquetes permiten instalar y actualizar automáticamente repositorios, a veces llamados "paquetes".
Muchos editores de software y otras organizaciones mantienen servidores en Internet para este fin, ya sea de forma gratuita o mediante una tarifa de suscripción. Los repositorios pueden ser únicamente para programas particulares, como CPAN para el lenguaje de programación Perl , o para un sistema operativo completo . Los operadores de dichos repositorios suelen proporcionar un sistema de gestión de paquetes , herramientas destinadas a buscar, instalar y manipular paquetes de software de los repositorios. Por ejemplo, muchas distribuciones de Linux utilizan la herramienta de empaquetado avanzado (APT), que se encuentra comúnmente en las distribuciones basadas en Debian , o Yellowdog Updater, modificado ( yum ), que se encuentra en las distribuciones basadas en Red Hat . También existen múltiples sistemas de gestión de paquetes independientes, como pacman, utilizado en Arch Linux y equo, que se encuentra en Sabayon Linux .
Así como los repositorios de software están diseñados para incluir paquetes útiles, los principales repositorios están diseñados para estar libres de malware . Si una computadora está configurada para usar un repositorio firmado digitalmente de un proveedor confiable y se combina con un sistema de permisos apropiado , esto reduce significativamente la amenaza de malware para estos sistemas. Como efecto secundario, muchos sistemas que tienen estas capacidades no necesitan software antimalware como el software antivirus . [1]
La mayoría de las principales distribuciones de Linux tienen muchos repositorios en todo el mundo que reflejan el repositorio principal.
En un entorno empresarial, un repositorio de software suele utilizarse para almacenar artefactos o para reflejar repositorios externos a los que puede resultar inaccesible debido a restricciones de seguridad. Dichos repositorios pueden proporcionar funcionalidad adicional, como control de acceso, control de versiones, controles de seguridad para el software cargado, funcionalidad de clúster, etc. y normalmente admiten una variedad de formatos en un solo paquete, para satisfacer todas las necesidades de una empresa y, por lo tanto, apuntar a proporcionar un único punto de verdad. Ejemplos populares son JFrog Artifactory, [2] [3] el repositorio Nexus [4] y Cloudsmith, [5] un producto basado en la nube.
En el lado del cliente, un administrador de paquetes ayuda a instalar y actualizar los repositorios.
En el lado del servidor, un repositorio de software normalmente lo administra el control de fuente o los administradores de repositorio. Algunos de los administradores de repositorios permiten agregar otras ubicaciones de repositorios en una URL y proporcionar un proxy de almacenamiento en caché. Al realizar compilaciones continuas, se producen muchos artefactos y, a menudo, se almacenan de forma centralizada, por lo que es importante eliminar automáticamente los que no se publican.
Un sistema de gestión de paquetes es diferente de un proceso de desarrollo de paquetes .
Un uso típico de un sistema de gestión de paquetes es facilitar la integración de código de fuentes posiblemente diferentes en una unidad operativa independiente y coherente. Por tanto, se podría utilizar un sistema de gestión de paquetes para producir una distribución de Linux , posiblemente una distribución adaptada a una aplicación restringida específica.
Por el contrario, un proceso de desarrollo de paquetes se utiliza para gestionar el codesarrollo de código y documentación de una colección de funciones o rutinas con un tema común, produciendo así un paquete de funciones de software que normalmente no estarán completos ni utilizables por sí solos. Un buen proceso de desarrollo de paquetes ayudará a los usuarios a cumplir con buenas prácticas de documentación y codificación, integrando cierto nivel de pruebas unitarias .
La siguiente tabla enumera algunos idiomas con repositorios de software contribuido. La columna "Autocomprobaciones" describe las comprobaciones de rutina realizadas.
Muy pocas personas tienen la capacidad de probar su software en múltiples sistemas operativos con diferentes versiones del código central y con otros paquetes contribuidos que puedan usar. Para el lenguaje de programación R , Comprehensive R Archive Network (CRAN) ejecuta pruebas de forma rutinaria.
Para comprender el valor de esto, imagine una situación con dos desarrolladores, Sally y John. Sally aporta un paquete A. Sally solo ejecuta la versión actual del software en una versión de Microsoft Windows y solo lo ha probado en ese entorno. A intervalos más o menos regulares, CRAN prueba la contribución de Sally en una docena de combinaciones de sistemas operativos y versiones del software principal del lenguaje R. Si uno de ellos genera un error, recibe ese mensaje de error. Con suerte, los detalles del mensaje de error pueden proporcionar información suficiente para permitir una solución al error, incluso si no puede replicarlo con su hardware y software actuales. A continuación, supongamos que John aporta al repositorio un paquete B que utiliza un paquete A. El paquete B pasa todas las pruebas y está disponible para los usuarios. Más tarde, Sally envía una versión mejorada de A, que desafortunadamente rompe B. Las comprobaciones automáticas permiten proporcionar información a John para que pueda solucionar el problema.
Este ejemplo expone tanto una fortaleza como una debilidad en el sistema de paquetes contribuidos de R: CRAN admite este tipo de pruebas automatizadas de paquetes contribuidos, pero los paquetes contribuidos a CRAN no necesitan especificar las versiones de otros paquetes contribuidos que utilizan. Existen procedimientos para solicitar versiones específicas de paquetes, pero es posible que los contribuyentes no utilicen esos procedimientos.
Más allá de esto, un repositorio como CRAN que ejecuta comprobaciones periódicas de los paquetes aportados en realidad proporciona un conjunto de pruebas extenso, aunque ad hoc, para versiones de desarrollo del lenguaje principal. Si Sally (en el ejemplo anterior) recibe un mensaje de error que no comprende o que considera inapropiado, especialmente de una versión de desarrollo del lenguaje, puede (y a menudo lo hace con R) pedir ayuda al equipo central de desarrollo del lenguaje. . De esta manera, el repositorio puede contribuir a mejorar la calidad del software del lenguaje central.
(Partes de esta tabla se copiaron de una "Lista de repositorios principales por lenguaje de programación" en Stack Overflow [24] )
Muchos otros lenguajes de programación, entre ellos C , C++ y Fortran , no poseen un repositorio de software central con alcance universal. Los repositorios notables con alcance limitado incluyen:
Los administradores de paquetes ayudan a administrar los repositorios y su distribución. Si se actualiza un repositorio, un administrador de paquetes normalmente permitirá al usuario actualizar ese repositorio a través del administrador de paquetes. También ayudan a gestionar cosas como las dependencias entre otros repositorios de software. Algunos ejemplos de administradores de paquetes incluyen:
Como parte del ciclo de vida del desarrollo, el código fuente se integra continuamente en artefactos binarios mediante integración continua . Esto puede interactuar con un administrador de repositorio binario de manera muy similar a como lo haría un desarrollador al obtener artefactos de los repositorios y enviar compilaciones allí. La estrecha integración con los servidores de CI permite el almacenamiento de metadatos importantes como:
Los artefactos y los paquetes significan inherentemente cosas diferentes. Los artefactos son simplemente una salida o colección de archivos (por ejemplo, JAR, WAR, DLLS, RPM, etc.) y uno de esos archivos puede contener metadatos (por ejemplo, un archivo POM). Mientras que los paquetes son un archivo único en un formato bien definido (por ejemplo, NuGet ) que contiene archivos apropiados para el tipo de paquete (por ejemplo, DLL, PDB). [33] Muchos artefactos resultan de construcciones, pero otros tipos también son cruciales. Los paquetes son esencialmente una de dos cosas: una biblioteca o una aplicación. [34]
En comparación con los archivos fuente, los artefactos binarios suelen ser más grandes en órdenes de magnitud, rara vez se eliminan o se sobrescriben (excepto en casos excepcionales, como instantáneas o compilaciones nocturnas) y, por lo general, van acompañados de muchos metadatos, como identificación, nombre del paquete, versión. , licencia y más.
Los metadatos describen un artefacto binario, se almacenan y especifican por separado del propio artefacto y pueden tener varios usos adicionales. La siguiente tabla muestra algunos tipos de metadatos comunes y sus usos: