Publicación de bibliotecas
⏱ Dedicación recomendada: 0 minutos
Esto considera el contenido visible y relevante, e ignora texto colapsado o marcado como opcional.
r8vnhill/echo-app-kt
La publicación de bibliotecas es una etapa clave en el desarrollo de software, ya que permite compartir y distribuir código reutilizable con otros proyectos o desarrolladorxs. Existen diversas formas de hacerlo, desde subir archivos de release manualmente hasta utilizar un repositorio de paquetes como GitHub Packages para gestionar versiones y dependencias de manera más eficiente.
📌 Versionado semántico (SemVer)
Antes de publicar una biblioteca, es importante definir un esquema de versionado adecuado para garantizar compatibilidad y control sobre los cambios.
Versionado Semántico (SemVer)
Un esquema comúnmente usado es SemVer (Semantic Versioning), que sigue la estructura MAJOR.MINOR.PATCH
:
MAJOR
: Cambios incompatibles con versiones anteriores.MINOR
: Nuevas características compatibles con versiones anteriores.PATCH
: Correcciones de errores sin cambios en la API.
Ejemplo: 1.2.3
donde 1
es la versión mayor, 2
es la menor y 3
es el parche.
Este esquema permite que otrxs desarrolladorxs comprendan fácilmente la compatibilidad de una nueva versión y reduzcan el riesgo de romper integraciones en sus proyectos.
🚀 Publicando un release
La primera forma que veremos de publicar una biblioteca es hacer un release en GitHub. Para ello, debemos seguir los siguientes pasos:
Versión más "sencilla" utilizando gh
- Windows
- Linux/Mac
gh release create v1.0.0 `
.\lib\build\libs\lib-1.0.0-all.jar `
.\lib\build\libs\lib-1.0.0-docs.jar `
--title "Release v1.0.0" `
--notes "Added functionality to echo a message with a timestamp"
gh release create v1.0.0 \
./lib/build/libs/lib-1.0.0-all.jar \
./lib/build/libs/lib-1.0.0-docs.jar \
--title "Release v1.0.0" \
--notes "Added functionality to echo a message with a timestamp"
- Crear un release en GitHub: Ir a la sección de "Releases" en el repositorio de la biblioteca y hacer clic en "Create a new release". Aquí debemos especificar la versión del release, un título y una descripción detallada de los cambios realizados.
- Subir los archivo JAR: Subir los archivos JAR generados por la biblioteca, que contienen el código compilado y la documentación.
- Publicar el release: Una vez completados los pasos anteriores, hacer clic en "Publish release" para publicar el release en GitHub.
📦 GitHub Packages
GitHub Packages es un sistema integrado en GitHub que permite almacenar, gestionar y compartir paquetes de software dentro del ecosistema de GitHub, facilitando la distribución y reutilización en diferentes proyectos.
🔑 Principales características
- Soporte para múltiples formatos: GitHub Packages admite una variedad de tipos de paquetes, incluidos Maven, Gradle, npm, NuGet, RubyGems y Docker, entre otros.
- Integración completa con GitHub: Puedes publicar, versionar y compartir paquetes directamente desde tus repositorios de GitHub, lo que facilita la colaboración y el control de versiones.
- Distribución sencilla: Publicar tu biblioteca en GitHub Packages te permite integrarla de manera rápida en otros proyectos, simplificando su reutilización y acceso para tus colaboradores.
A continuación, procederemos a publicar nuestra biblioteca en GitHub Packages, lo que nos permitirá incluirla fácilmente en otros proyectos.
🔐 Generar un token de acceso
Para publicar paquetes en GitHub Packages, necesitamos un token de acceso personal con los permisos adecuados. Sigue estos pasos para generar un token de acceso:
- Ir a la configuración de tu cuenta: En GitHub, haz clic en tu avatar en la esquina superior derecha y selecciona "Settings" (Configuración).
- Acceder a los tokens de acceso: En la barra lateral izquierda, selecciona "Developer settings" (Configuración de desarrollador) y luego "Personal access tokens" (Tokens de acceso personal).
- Generar un nuevo token: Haz clic en "Tokens (classic)", luego en "Generate new token" (Generar nuevo token) y "Generate new token (classic)" (Generar nuevo token clásico).
- Configurar los permisos: Selecciona los permisos necesarios para publicar paquetes en GitHub Packages, como "write:packages" y "read:packages". Coloca un nombre descriptivo para el token y haz clic en "Generate token" (Generar token).
- Guardar el token: Copia el token generado y guárdalo en un lugar seguro, ya que no podrás verlo nuevamente.
¡No compartas tu token de acceso personal con otras personas! Este token te da acceso a tu cuenta de GitHub y a los recursos asociados.
Ahora, debemos tener acceso desde el script de construcción a este token y a nuestro nombre de usuario de GitHub. Para ello, podemos utilizar variables de entorno o un archivo de configuración externo. Utilizaremos un archivo de configuración para mantener la información segura y accesible desde el script de construcción.
🛠️ Crear un archivo de configuración
Crea un archivo de configuración llamado github.properties
en el directorio raíz de tu proyecto con la siguiente estructura:
github.token=ghp_tu-token
github.username=tu-usuario
⚙️ Configurar Gradle para publicar en GitHub Packages
Lo primero que haremos será crear un nuevo plugin de convenciones llamado publish.conventions.gradle.kts
con el siguiente contenido:
plugins {
`maven-publish`
}
Esto nos permitirá configurar las convenciones de publicación de Maven en nuestro proyecto. A continuación, definiremos una extensión llamada ArtifactExtension
en el paquete extensions
que contendrá la información necesaria para publicar nuestro artefacto en GitHub Packages.
package extensions
abstract class ArtifactExtension {
abstract var artifactName: String
abstract var artifactVersion: String
}
Luego, crearemos la extensión en publish.conventions.gradle.kts
y lo utilizaremos en el build
de nuestra biblioteca.
import extensions.ArtifactExtension
// ...
project.extensions.create<ArtifactExtension>("artifact")
- Paso 1
- Paso 2
- Paso 3
- Paso 4
- Paso 5
- Paso 6
- Paso 7
// ...
val githubProperties = Properties().apply {
load(rootProject.file("github.properties").reader())
}
val githubToken: String = githubProperties.getProperty("github.token")
val githubUser: String = githubProperties.getProperty("github.username")
afterEvaluate { }
En este paso, cargamos las propiedades del archivo github.properties
que contienen el token de acceso y el nombre de usuario de GitHub. Registraremos la tarea de publicación después de evaluar el proyecto, ya que necesitamos acceder a las extensiones y tareas que se definen durante la evaluación.
// ...
afterEvaluate {
val artifactExtension = project.extensions.getByType<ArtifactExtension>()
project.extensions.getByType<FatJarExtension>().apply {
implementationTitle = artifactExtension.artifactName
implementationVersion = artifactExtension.artifactVersion
}
}
En este paso, asignamos las propiedades implementationTitle
e implementationVersion
del plugin FatJarExtension
utilizando los valores de artifactName
y artifactVersion
, respectivamente. Para lograr esto, es necesario acceder a la extensión del proyecto después de que se haya evaluado, garantizando que las configuraciones y tareas estén completamente definidas.
// ...
afterEvaluate {
// ...
publishing { }
}
El bloque publishing
nos permite definir las publicaciones de Maven y especificar los repositorios donde se almacenarán los artefactos generados. A través de este bloque, podemos configurar los detalles de cada publicación y gestionar los destinos de despliegue.
// ...
afterEvaluate {
// ...
publishing {
publications { }
}
}
El bloque publications
nos permite definir las publicaciones de Maven que se generarán, especificando los artefactos y las fuentes que formarán parte de cada publicación.
// ...
afterEvaluate {
// ...
publishing {
publications {
create<MavenPublication>("mavenKotlin") { }
}
}
}
En este paso, creamos una publicación de Maven llamada mavenKotlin
, que incluirá los artefactos generados por la biblioteca, listos para ser distribuidos.
// ...
afterEvaluate {
// ...
publishing {
publications {
create<MavenPublication>("mavenKotlin") {
groupId = project.group.toString()
artifactId = artifactExtension.artifactName
version = artifactExtension.artifactVersion
from(components["kotlin"])
artifact(tasks["dokkaJar"])
artifact(tasks["fatJar"])
}
}
}
}
En este paso, configuramos los detalles clave de la publicación de Maven, como el groupId
, artifactId
y version
, además de los artefactos y las fuentes que se incluirán en la publicación.
// ...
afterEvaluate {
// ...
publishing {
// ...
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/tu-usuario/echo-app-kt")
credentials {
username = githubUser
password = githubToken
}
}
}
}
}
Finalmente, configuramos GitHub Packages como el repositorio de destino para la publicación, definiendo la URL y las credenciales necesarias para la autenticación y el despliegue de los artefactos.
Reemplaza tu-usuario
por tu nombre de usuario de GitHub y echo-app-kt
por el nombre de tu repositorio.
🚫 .gitignore
Es MUY IMPORTANTE que agregues el archivo github.properties
al .gitignore
para evitar subir tus credenciales a GitHub. A continuación te proporcionamos un ejemplo de archivo .gitignore
que puedes utilizar:
.gradle
build
.idea
**/build/
!src/**/build/
gradle-app.setting
!gradle-wrapper.jar
!gradle-wrapper.properties
.gradletasknamecache
.project
.classpath
*.class
*.log
*.ctxt
.mtj.tmp/
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
hs_err_pid*
replay_pid*
github.properties
Si necesitas un .gitignore
personalizado, puedes utilizar gitignore.io para generar uno basado en tus necesidades específicas.
🚀 Publicar en GitHub Packages
Con la configuración de Gradle lista para publicar en GitHub Packages, puedes ejecutar el siguiente comando para subir tu biblioteca:
./gradlew publish
Este comando generará los artefactos de la biblioteca y los enviará a GitHub Packages, haciéndolos accesibles para su uso en otros proyectos.
¡Y eso es todo! 🎉 Ahora has aprendido a publicar tu biblioteca en GitHub Packages, facilitando compartir tu código con otrxs desarrolladorxs de manera rápida y eficiente. 🤝✨
📥 Utilizar la biblioteca publicada
Para utilizar la biblioteca que has publicado en GitHub Packages en otro proyecto, debes agregarla como una dependencia a tu proyecto.
Primero, agreguemos la biblioteca a nuestro catálogo de versiones:
[versions]
# ...
echolib = "1.0.0" # Versión de la librería
[libraries]
# ...
echo = { module = "com.github.tu-usuario:echo-app-lib", version.ref = "echolib" }
# ...
Ten en cuenta que si nombraras la versión como echo-lib
en vez de echolib
, habría un conflicto de nombres, ya que tanto echo
como echo-lib
tendrían el mismo prefijo. Esto haría que Gradle no pudiera diferenciar entre echo
de libs.versions.echo
y libs.versions.echo.lib
. Otra solución sería renombrar echo
a echo-app
.
Luego, indicamos a Gradle que busque el paquete en GitHub Packages:
// ...
val githubProperties = Properties().apply {
load(rootProject.file("github.properties").reader())
}
val githubToken: String = githubProperties.getProperty("github.token")
val githubUser: String = githubProperties.getProperty("github.username")
@Suppress("UnstableApiUsage")
dependencyResolutionManagement {
repositories {
mavenCentral()
maven {
url = uri("https://maven.pkg.github.com/tu-usuario/tu-repositorio")
credentials {
username = githubUser
password = githubToken
}
}
}
}
Finalmente, agregamos la dependencia en nuestro proyecto:
// ...
dependencies {
implementation(libs.echo)
}
¡Listo! Ahora solo sincroniza el proyecto, y la biblioteca estará disponible para su uso en tu aplicación.
❓ ¿Cuándo usar Releases vs. GitHub Packages?
Método | Cuándo usarlo |
---|---|
GitHub Releases | Cuando necesitas compartir una versión específica de la biblioteca en un formato descargable, como un .jar o .zip . Ideal para distribuciones manuales y accesibles sin configuración adicional. |
GitHub Packages | Cuando necesitas gestionar dependencias de manera automática en proyectos que usan Maven o Gradle. Facilita la integración con otros proyectos y versiones futuras. |
🎯 Conclusiones
Publicar bibliotecas es un paso esencial en el desarrollo de software, ya que permite compartir código reutilizable con otrxs desarrolladorxs y proyectos. A lo largo de esta lección, hemos explorado dos formas de distribuir una biblioteca: GitHub Releases y GitHub Packages, cada una con sus propias ventajas y casos de uso.
Además, revisamos la importancia del versionado semántico (SemVer) para garantizar compatibilidad entre versiones y evitar interrupciones en el código de quienes consumen nuestra biblioteca.
🔑 Puntos clave
- Versionado Semántico: Usar SemVer (
MAJOR.MINOR.PATCH
) permite comunicar claramente cambios en la API de una biblioteca. - GitHub Releases: Útil para distribuir versiones descargables sin necesidad de gestionar dependencias.
- GitHub Packages: Facilita la integración con Maven y Gradle, permitiendo incluir la biblioteca en otros proyectos sin necesidad de descargas manuales.
- Automatización con Gradle: Configurar
publish.conventions.gradle.kts
simplifica la publicación de la biblioteca y mantiene la gestión de versiones organizada. - Gestión de credenciales: Usar
github.properties
evita exponer datos sensibles en el código fuente y mantiene la seguridad del acceso.
🧰 ¿Qué nos llevamos?
Publicar bibliotecas no es solo compartir código, sino construir herramientas que otras personas puedan utilizar, mejorar y expandir. Al adoptar buenas prácticas en versionado, compatibilidad y distribución, facilitamos la integración y fomentamos un ecosistema más sólido y colaborativo.
Si queremos ofrecer una biblioteca fácil de descargar y usar sin configuración adicional, GitHub Releases es una gran opción. Pero si buscamos que nuestra biblioteca crezca y sea adoptada en múltiples proyectos de manera eficiente, GitHub Packages nos permite gestionar versiones de forma automatizada y mantener un flujo de trabajo profesional.
Dominar estos procesos no solo mejora la calidad de nuestro software, sino que también nos posiciona dentro de una comunidad de desarrolladorxs que crean, mantienen y colaboran en herramientas abiertas y reutilizables. Al compartir conocimientos y mejores prácticas, ayudamos a que más personas contribuyan y se beneficien del ecosistema que construimos juntxs. 🚀✨
📖 Referencias
🔥 Recomendadas
- 🌐 Preston-Werner, T. (s. f.). Versionado Semántico 2.0.0. Semantic Versioning. Recuperado 21 de marzo de 2025, de https://semver.org/lang/es/
- 🌐 Publishing a package. (s. f.). GitHub Docs. Recuperado 25 de marzo de 2025, de https://docs-internal.github.com/en/packages/learn-github-packages/publishing-a-package