[ADDED] Script para crear proyectos con estructura específica por tipo
This commit is contained in:
parent
760f6784a4
commit
4a168c5c31
1 changed files with 237 additions and 0 deletions
237
bin/project_create.sh
Executable file
237
bin/project_create.sh
Executable file
|
@ -0,0 +1,237 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Script: project_create.sh
|
||||
# Description: Crea una carpeta de proyecto con la estructura requerida
|
||||
# Modified: 2025-03-12
|
||||
# Derechos de Autor (C) [2025] [Mauro Rosero P. <mauro@rosero.one>]
|
||||
#
|
||||
# Este programa es software libre: usted puede redistribuirlo y/o modificarlo
|
||||
# bajo los términos de la Licencia Pública Affero General de GNU tal como
|
||||
# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia,
|
||||
# o (a su elección) cualquier versión posterior.
|
||||
#
|
||||
# Este programa se distribuye con la esperanza de que sea útil,
|
||||
# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de
|
||||
# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
# Licencia Pública Affero General de GNU para obtener más detalles.
|
||||
#
|
||||
# Debería haber recibido una copia de la Licencia Pública Affero General
|
||||
# junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>.
|
||||
|
||||
# Directorios base
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
BASE_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
CONFIG_DIR="$SCRIPT_DIR/config"
|
||||
LIB_DIR="$SCRIPT_DIR/lib"
|
||||
MSG_DIR="$SCRIPT_DIR/msg"
|
||||
|
||||
# Cargar libraries
|
||||
source "$LIB_DIR/base.lib"
|
||||
source "$LIB_DIR/console.lib"
|
||||
source "$MSG_DIR/head.es"
|
||||
|
||||
# Variables globales
|
||||
title="${head_000}"
|
||||
apps_title="Creación de Proyecto"
|
||||
PROJECT_FOLDER=""
|
||||
PROJECT_TYPE=""
|
||||
VALID_TYPES=("ansible" "odoo" "sp32home" "nodejs" "python" "cobol" "otros")
|
||||
|
||||
# Verifica que dialog esté instalado
|
||||
if ! command -v dialog &> /dev/null; then
|
||||
echo "${head_001}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Función para obtener la carpeta de proyectos desde projects.dat
|
||||
function get_projects_folder() {
|
||||
if [ -f "$CONFIG_DIR/projects.dat" ]; then
|
||||
PROJECT_FOLDER=$(head -n 1 "$CONFIG_DIR/projects.dat")
|
||||
|
||||
# Si la carpeta no comienza con / (ruta absoluta), la convertimos en ruta absoluta
|
||||
if [[ "$PROJECT_FOLDER" != /* ]]; then
|
||||
PROJECT_FOLDER="$HOME/$PROJECT_FOLDER"
|
||||
fi
|
||||
else
|
||||
PROJECT_FOLDER="$HOME/proyectos"
|
||||
echo "proyectos" > "$CONFIG_DIR/projects.dat"
|
||||
fi
|
||||
|
||||
# Verificar si la carpeta base de proyectos existe, si no, crearla
|
||||
if [ ! -d "$PROJECT_FOLDER" ]; then
|
||||
mkdir -p "$PROJECT_FOLDER"
|
||||
fi
|
||||
}
|
||||
|
||||
# Función para solicitar el nombre del proyecto
|
||||
function request_project_name() {
|
||||
dialog_input_box "Ingrese el nombre del proyecto" "El nombre debe ser único dentro de la carpeta de proyectos" ""
|
||||
|
||||
if [ $codex -ne 0 ]; then
|
||||
echo "Operación cancelada por el usuario."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PROJECT_NAME="$value"
|
||||
|
||||
# Validar que el nombre no esté vacío
|
||||
if [ -z "$PROJECT_NAME" ]; then
|
||||
dialog_error_box "$head_error" "El nombre del proyecto no puede estar vacío."
|
||||
request_project_name
|
||||
return
|
||||
fi
|
||||
|
||||
# Validar que el nombre sea válido para una carpeta
|
||||
if [[ "$PROJECT_NAME" =~ [^a-zA-Z0-9_-] ]]; then
|
||||
dialog_error_box "$head_error" "El nombre del proyecto solo puede contener letras, números, guiones y guiones bajos."
|
||||
request_project_name
|
||||
return
|
||||
fi
|
||||
|
||||
PROJECT_PATH="$PROJECT_FOLDER/$PROJECT_NAME"
|
||||
|
||||
# Verificar si el proyecto ya existe
|
||||
if [ -d "$PROJECT_PATH" ]; then
|
||||
dialog_yesno "El proyecto '$PROJECT_NAME' ya existe. ¿Desea seleccionar otro nombre?"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
request_project_name
|
||||
else
|
||||
echo "Operación cancelada. El proyecto ya existe."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Función para solicitar el tipo de proyecto
|
||||
function request_project_type() {
|
||||
# Construir las opciones para el diálogo
|
||||
OPTIONS=""
|
||||
for i in "${!VALID_TYPES[@]}"; do
|
||||
OPTIONS="$OPTIONS ${VALID_TYPES[$i]} ${VALID_TYPES[$i]} off"
|
||||
done
|
||||
|
||||
dialog_input_radio "Seleccione el tipo de proyecto" "Este tipo determinará la estructura inicial del proyecto" "$OPTIONS"
|
||||
|
||||
if [ $codex -ne 0 ]; then
|
||||
echo "Operación cancelada por el usuario."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PROJECT_TYPE="$value"
|
||||
|
||||
# Validar que el tipo seleccionado sea válido
|
||||
VALID_TYPE=0
|
||||
for t in "${VALID_TYPES[@]}"; do
|
||||
if [ "$t" == "$PROJECT_TYPE" ]; then
|
||||
VALID_TYPE=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $VALID_TYPE -eq 0 ]; then
|
||||
dialog_error_box "$head_error" "El tipo de proyecto seleccionado no es válido."
|
||||
request_project_type
|
||||
fi
|
||||
}
|
||||
|
||||
# Función para crear la estructura del proyecto
|
||||
function create_project_structure() {
|
||||
# Crear la carpeta del proyecto
|
||||
mkdir -p "$PROJECT_PATH"
|
||||
|
||||
# Crear estructura básica común a todos los proyectos
|
||||
mkdir -p "$PROJECT_PATH/docs"
|
||||
mkdir -p "$PROJECT_PATH/src"
|
||||
|
||||
# Crear archivo README.md básico
|
||||
cat > "$PROJECT_PATH/README.md" << EOF
|
||||
# Proyecto $PROJECT_NAME
|
||||
|
||||
## Descripción
|
||||
Proyecto de tipo $PROJECT_TYPE creado con MRDevs Tools.
|
||||
|
||||
## Estructura
|
||||
- docs/ - Documentación del proyecto
|
||||
- src/ - Código fuente
|
||||
|
||||
## Configuración
|
||||
Para configurar el entorno de desarrollo, siga las instrucciones en docs/setup.md.
|
||||
|
||||
## Licencia
|
||||
Este proyecto está licenciado bajo AGPL-3.0.
|
||||
EOF
|
||||
|
||||
# Crear estructura específica según el tipo de proyecto
|
||||
case "$PROJECT_TYPE" in
|
||||
"ansible")
|
||||
mkdir -p "$PROJECT_PATH/inventories"
|
||||
mkdir -p "$PROJECT_PATH/roles"
|
||||
mkdir -p "$PROJECT_PATH/playbooks"
|
||||
touch "$PROJECT_PATH/ansible.cfg"
|
||||
;;
|
||||
"odoo")
|
||||
mkdir -p "$PROJECT_PATH/addons"
|
||||
mkdir -p "$PROJECT_PATH/data"
|
||||
mkdir -p "$PROJECT_PATH/scripts"
|
||||
mkdir -p "$PROJECT_PATH/build"
|
||||
touch "$PROJECT_PATH/.typset"
|
||||
;;
|
||||
"sp32home")
|
||||
mkdir -p "$PROJECT_PATH/hardware"
|
||||
mkdir -p "$PROJECT_PATH/firmware"
|
||||
mkdir -p "$PROJECT_PATH/libraries"
|
||||
mkdir -p "$PROJECT_PATH/build"
|
||||
;;
|
||||
"nodejs")
|
||||
mkdir -p "$PROJECT_PATH/src/controllers"
|
||||
mkdir -p "$PROJECT_PATH/src/models"
|
||||
mkdir -p "$PROJECT_PATH/src/routes"
|
||||
mkdir -p "$PROJECT_PATH/public"
|
||||
mkdir -p "$PROJECT_PATH/tests"
|
||||
touch "$PROJECT_PATH/package.json"
|
||||
;;
|
||||
"python")
|
||||
mkdir -p "$PROJECT_PATH/src/$PROJECT_NAME"
|
||||
mkdir -p "$PROJECT_PATH/tests"
|
||||
touch "$PROJECT_PATH/setup.py"
|
||||
touch "$PROJECT_PATH/requirements.txt"
|
||||
# Crear un __init__.py básico
|
||||
touch "$PROJECT_PATH/src/$PROJECT_NAME/__init__.py"
|
||||
;;
|
||||
"cobol")
|
||||
mkdir -p "$PROJECT_PATH/src/main"
|
||||
mkdir -p "$PROJECT_PATH/src/copy"
|
||||
mkdir -p "$PROJECT_PATH/build"
|
||||
;;
|
||||
"otros")
|
||||
# Estructura mínima, ya creada anteriormente
|
||||
;;
|
||||
esac
|
||||
|
||||
# Crear archivo de configuración para indicar el tipo de proyecto
|
||||
echo "$PROJECT_TYPE" > "$PROJECT_PATH/.project-type"
|
||||
|
||||
# Mostrar mensaje de éxito
|
||||
dialog_error_box "$head_info" "Proyecto '$PROJECT_NAME' de tipo '$PROJECT_TYPE' creado exitosamente en:\n$PROJECT_PATH"
|
||||
}
|
||||
|
||||
# Función principal
|
||||
function main() {
|
||||
clear
|
||||
|
||||
# Obtener la carpeta de proyectos
|
||||
get_projects_folder
|
||||
|
||||
# Solicitar nombre del proyecto
|
||||
request_project_name
|
||||
|
||||
# Solicitar tipo de proyecto
|
||||
request_project_type
|
||||
|
||||
# Crear estructura del proyecto
|
||||
create_project_structure
|
||||
}
|
||||
|
||||
# Ejecutar función principal
|
||||
main
|
Loading…
Reference in a new issue