Scaffold
Esta herramienta permite gestionar plantillas desde la línea de comandos. Es simple, versátil y veloz.
Instalación
cargo install scaffold-cliVariable de entorno
El programa utiliza únicamente SCAFFOLDS como variable de entorno, la cual define la ruta donde se almacenan las plantillas.
export SCAFFOLDS="$HOME/scaffolds"Comandos
init: despliega una plantilla. Si no se especifica el destino, se utiliza el directorio en donde se ejecuta el comando.
scaffold init template [destino]
list: lista las plantillas disponibles.
scaffold list [grupo/plantilla]
schema: imprime el contenido deschema.json, si está disponible.
scaffold schema grupo/plantilla
completion: genera el script de autocompletado para la shell seleccionada.
scaffold completion [shell]
help: muestra el mensaje de ayuda.
scaffold help
version: muestra la versión del programa.
scaffold versionSistema de organización
Para que el programa funcione correctamente, las plantillas deben organizarse en directorios.
El directorio padre (grupo) puede contener uno o varios subdirectorios (plantillas), cada uno con los elementos que deseas utilizar.
$SCAFFOLDS/
├── grupo/
│ ├── plantilla/
│ │ ├── fichero
│ │ └── directorio
│ └── plantilla/
└── grupo/
├── plantilla/
└── plantilla/
Por ejemplo, puedes organizar tus justfiles para diferentes escenarios.
just/
├── just/
│ └── justfile
└── publish/
├── dist/
│ └── justfile
└── justfilePlantilla predeterminada
El programa determina la plantilla predeterminada mediante dos reglas:
- Cuando es la única plantilla disponible dentro de un grupo.
- Cuando el nombre de la plantilla coincide con el nombre del grupo.
.
├── ansible/
│ ├── ansible -> (plantilla predeterminada)
│ ├── database/
│ └── firewall/
├── css/
│ ├── blades/
│ └── css -> (plantilla predeterminada)
├── just/
│ ├── just -> (plantilla predeterminada)
│ └── publish/
└── tofu/
└── forgejo -> (plantilla predeterminada)
En este contexto, los siguientes comandos generan el mismo resultado:
scaffold init tofu .
scaffold init tofu/forgejo .scaffold init ansible .
scaffold init ansible/ansible .Schema
De manera opcional, puedes utilizar schema.json para configurar el despliegue de tus plantillas.
Las opciones disponibles son include, exclude, variables, commands y delimiters.
just/
├── just/
│ ├── justfile
│ └── schema.json
└── publish/
├── dist/
│ └── justfile
├── justfile
└── schema.json
Las opciones
includeyexcludepermiten utilizar patrones glob (glob patterns) para seleccionar ficheros y directorios.
Inclusión de ficheros y directorios
Con include puedes seleccionar manualmente los elementos que debe desplegar la plantilla.
schema.json
{
"include": [
"pyproject.toml",
"src/**/*.py"
]
}.
├── .git -> (no se incluye)
├── pyproject.toml
├── README.md -> (no se incluye)
├── schema.json -> (no se incluye por defecto)
└── src/
└── tool/
└── __init__.pyExclusión de ficheros y directorios
Con exclude puedes seleccionar manualmente los elementos que deseas excluir.
schema.json
{
"exclude": [
".git",
"README.md"
]
}
Esta opción es útil si deseas versionar tus plantillas e incluir su propia documentación.
Variables
En schema.json puedes definir tus propias variables y sus valores se inyectarán en todos los ficheros donde se detecten las variables correspondientes.
Las variables se exponen mediante flags de la línea de comandos al ejecutar scaffold init.
Por ejemplo, puedes definir la variable port. El programa buscará {{port}} en todos los ficheros y realizará la sustitución correspondiente.
{
"variables": {
"port": "8080"
}
}scaffold init [template] --port 9000
Un caso de uso más complejo puede ser el siguiente:
{
"variables": {
"name": "Nombre de proyecto",
"description": "Hello world",
"port": 8080
}
}scaffold init web/laravel ./new-dashboard \
--name dashboard \
--description "Hotel reservation dashboard" \
--port 9000Comandos
Hay casos en los cuales será necesario ejecutar tareas de inicialización al desplegar una plantilla; para ello está disponible la opción commands.
schema.json
{
"commands": [
["git", "init", "--initial-branch=dev"],
["npm", "install"],
["direnv", "allow"]
]
}
Las variables que definas previamente pueden ser usadas en los comandos que utilices de la siguiente forma:
schema.json
{
"variables": {
"branch": "dev"
},
"commands": [
["git", "init", "--initial-branch={{branch}}"]
]
}
La plantilla crea la rama dev por defecto, pero puedes modificar la variable branch desde la línea de comandos.
scaffold init [plantilla] [directorio] --branch mainDelimitadores personalizados
Por defecto los delimitadores son llaves dobles {{ variable }}, pero los puedes modificar si agregas settings.delimiters.
schema.json
{
"settings": {
"delimiters": {
"open": "#{",
"close": "}"
}
}
}
En este escenario tendrías que usar #{variable} en tus ficheros.
Cargo.toml
[package]
name = "#{name}"
description = "#{name}"
[[bin]]
name = "#{bin}"
path = "src/main.rs"
src/main.rs
fn main() {
println!("#{name}");
}
Personalmente no me agrada que el software limite al usuario, pero usar delimitadores fijos simplifica el
schema.jsonrespecto a la versión anterior. Para lidiar con esa contradicción, decidí incluir la opción de definir delimitadores personalizados.settingsse reserva para posibles personalizaciones en el futuro.
License
BSD 2-Clause. See LICENSE.