Automatizacion: Workspace

Lecherito

Cuantas veces se te ha olvidado donde estaba el proyecto? Cuantas veces has ido a github y copiado y pegado la url para hacer un clone? Estas son las preguntas que trataba de responder cuando empece algo nuevo, algo que yo necesitaba.

La estructura del proyecto es la siguiente:

.
├── autocompletion
│   └── template.kt
├── commonMain
│   └── kotlin
│       └── lecherito
│           ├── beans.kt
│           ├── build
│           ├── cdp
│           ├── clean
│           ├── expects.kt
│           ├── file.kt
│           ├── globals.kt
│           ├── project
│           ├── publish
│           ├── release
│           ├── results.kt
│           ├── syncws
│           └── ws
├── linuxMain
│   └── kotlin
│       └── lecherito
│           ├── file.kt
│           └── system.kt
├── macosMain
│   └── kotlin
│       └── lecherito
│           ├── file.kt
│           └── system.kt
└── macosTest
    └── kotlin

Asi tengo el codigo comun en el common y todo lo necesario para macos y linux, cada uno en su sitio. Peque;as utilidades ya que practicamente todo el codigo esta en el common, pero asi puedo generar ejecutables para linux y macos.

Lo que no tiene extension es un directorio que contiene un comando, los comandos que tengo ahora mismo:

  1. ws: CD a la carpeta root del workspace
  2. build: Ejecuta gradle build basado en el alias, si se omite el alias lo hace en pwd
  3. clean: Ejecuta gradle clean basado en el alias.
  4. cdp: CD hacia el proyecto basado en el alias.
  5. release: Ejecuta gradle release basado en el alias. Release es un comando propio que tengo hecho yo que hace mas cosas que build (como por ejemplo, mas tests, linter, crear archivos extra etc)
  6. publish: Ejecuta gradle publish o gradle publishToMavenLocal basado en el alias.
  7. update: Ejecuta git pull --rebase basado en el alias.
  8. syncws: La joya de la corona, este lo que hace es escanear los repositorios y proyectos que tienes y te clona los que falten. Si tienes algun problema lo unico que tienes que hacer es rm -rf y syncws para clonarlo de nuevo.

Y para que tanto trabajo? Si tardas mas en programar eso que escribir gradle build!!!

Pues la cosa es que hace ya a;os que practicamente no uso los comandos de gradle excepto cuando son cosas raras ya que uso siempre estas utilidades. Y no se donde estan los proyectos ni nada, simplemente me conozco los alias y esto me ha ahorrado ya mas tiempo del que me he tirado programandolo, asi como que mucha gente en mi organizacion tambien lo esta usando (adaptado a las herramientas internas)

Todo esto es muy bonito, y como funciona?

Pues el principio es super sencillo, hay dos tipos de herramientas, las que hacen CD y las que no (ejecutables).

  1. Ejecutables: Simplemente ejecutan un comando en el sistema: result("gradle build")
  2. CD: Esto es algo mas dificil ya que si ejecutas algo en el sistema en la terminal lo que va a hacer es crear un subproceso y nunca va a cambiar el directorio de la terminal que estas usando, para esto cuando hago gradle release (he aqui una de las utilidades), crea un fichero dentro de mis .rcs con alias, entonces lo que hacen ejecutables como cdp es devolver una string que es el directorio y el alias se encarga de hacer el cd en la terminal.

Ejemplo del cdp

private class Cdp: CliktCommand(name = "cdp", autoCompleteEnvvar = "CDP_AUTOCOMPLETE") {
    val alias by argument()

    override fun run() {
        val (repository, project) = findProject(alias)

        val folder = "$wsRootFolder/${project.folder}/${repository.folder}"
        resultCd(folder)
    }
}

Configuracion

Todo es super sencillo basado en un fichero Json que sigue el siguiente esquema:

import kotlinx.serialization.Serializable

@Serializable
data class Project(
    val name: String,
    val folder: String,
    val repositories: List<Repository>
)

@Serializable
data class Repository(
    val name: String,
    val alias: String,
    val url: String,
    val folder: String
)

@Serializable
data class UserConfiguration(
    val projects: List<Project>
)

Ideas para el futuro

  1. Hacer build/clean/release/publish de varios repositorios a la vez. Ejemplo: build proyecto1 proyecto2.
  2. Hacer build/clean/release/publish que funcione para grupos de repositorios
  3. Que syncws te borre los que ya no tienes configurados
  4. Que funcione con cualquier lenguaje/build system, no solo gradle.

El proyecto no esta listo para ser mostrado, la verdad, tengo demasiadas cosas hardcoded con mi nombre y especificas a mis necesidades pero esto es para que penseis como lo quereis hacer u os de ideas para hacerlo en vuestro lenguaje favorito. Si hay alguna pregunta especifica seguramente la responda sin problemas!

5
Leos

Muy interesante, a favs para leermelo con más atención cuando tenga un momento!

Usuarios habituales

  • Leos
  • Lecherito