Usar un pom.xml, requirements.txt, package.json o go.mod de verdad en una tarea de código

Un alumno que aprende con un requirements.txt, un pom.xml o un package.json de verdad aprende lo que encontrará en cualquier trabajo y en cualquier proyecto de código abierto. Por eso una tarea de código declara aquí sus paquetes exactamente así: en el archivo que leen las herramientas del lenguaje, en la raíz del árbol de la tarea, sin nada más que rellenar.

El mismo archivo funciona en el ordenador de un alumno, así que un proyecto copiado fuera de la plataforma, o cargado desde Git, sigue funcionando sin que nadie reescriba sus paquetes en un formato nuestro.

Qué archivo, para qué lenguaje

Python lee requirements.txt o pyproject.toml, y un cuaderno lee requirements.txt. Java lee pom.xml. Go lee go.mod. JavaScript y TypeScript con Node leen package.json. El archivo está en la raíz del árbol, marcado como «Paquetes», y una tarea nueva se abre con un pequeño ejemplo para sustituir.

Bash, SQL, C, C++, C#, Haskell, OCaml, R, Ruby, PHP, Rust, Kotlin y Prolog no tienen archivo de paquetes: sus ejecuciones no tienen red a la que pueda llegar un gestor de paquetes, y lo que necesitan ya está instalado.

  1. Abre la tarea en su editor. El archivo de paquetes está en la raíz del árbol, marcado como «Paquetes».
  2. Escribe los paquetes. Escríbelos como en tu propio ordenador, cada uno con su versión exacta. Un intervalo como >=2.0 o ^4.18 se rechaza, porque una versión que cambia de una ejecución a otra no sirve para calificar.
  3. O trae el archivo que ya tienes. Súbelo a la raíz del árbol, o crea ahí un archivo con ese nombre, y se convierte en la lista de paquetes de la tarea.
  4. Pulsa «Ejecutar». Los paquetes se instalan antes de que empiece el programa. La primera ejecución tarda más; las siguientes reutilizan lo que ya se descargó.

Cómo se instalan los paquetes

Los paquetes se descargan en un contenedor aparte y se entregan a la ejecución en solo lectura, y la ejecución en sí no tiene red. Por eso el programa de un alumno no puede descargar nada mientras se ejecuta, y una tarea que declara los mismos paquetes que otra reutiliza lo que ya se descargó.

Los paquetes de cada lenguaje salen de una lista aprobada de paquetes muy usados, comparados como los nombra su ecosistema: los de Python y npm por su nombre, los de Java por el grupo del editor y los de Go por la ruta del módulo. Un paquete que no está en la lista se rechaza antes de ejecutar nada, y el mensaje lo nombra. Si tu curso necesita uno que falta, pídelo desde la página de Soporte.

Un archivo de paquetes puede ocupar hasta 64 KB, como cualquier otro archivo de la tarea. Los archivos de bloqueo como package-lock.json o poetry.lock no se leen: lo que se instala son las versiones exactas del archivo de paquetes.

Java y Maven

Un pom.xml se lee como lo lee Maven para sus dependencias: propiedades, gestión de dependencias, un pom padre e importaciones de BOM, y ámbitos, de modo que un paquete de ámbito test como JUnit solo está para las pruebas. Los paquetes vienen de Maven Central. Un archivo de compilación de Gradle no se lee; usa un pom.xml.

Una tarea de Java creada antes de que se admitiera pom.xml conserva su antiguo dependencies.xml, que sigue funcionando. Para pasarla a un pom, pega dentro un pom.xml completo o cámbiale el nombre a pom.xml.

Python, Node y Go

Una tarea de Python tiene un solo archivo de paquetes a la vez, así que para pasar de requirements.txt a pyproject.toml, cambia el nombre del archivo. De un pyproject.toml se leen las dependencias de [project] o la tabla de dependencias de Poetry.

De un package.json se leen sus dependencies, y también sus devDependencies cuando se ejecutan las pruebas, que es donde un proyecto de JavaScript guarda lo que solo importan sus pruebas. Los scripts de instalación nunca se ejecutan.

De un go.mod se leen sus dependencias y un replace que apunte un módulo a una carpeta del propio proyecto, así que una tarea puede ser un módulo de Go con paquetes propios.

Quién puede cambiar la lista

Los alumnos siempre ven el archivo de paquetes, porque leerlo forma parte de entender el proyecto. Que puedan cambiarlo es un ajuste de la tarea: si se permite, un alumno añade un paquete a su copia como lo haría en su propio ordenador, y la siguiente ejecución lo instala.

Preguntas frecuentes

¿Pueden los alumnos instalar paquetes ellos mismos?
En cualquier tarea con archivo de paquetes, si la tarea les permite cambiarlo. Añaden el paquete al archivo como en su propio ordenador, y la siguiente ejecución lo instala.
¿Puede un programa descargar paquetes mientras se ejecuta?
No. La ejecución no tiene red; los paquetes se descargan antes, en un contenedor aparte, desde la lista aprobada.
¿Admite Gradle?
No. Las tareas de Java leen un pom.xml.
¿Por qué cada versión tiene que ser exacta?
Para que todos los alumnos de la clase, y la calificación, se ejecuten con los mismos paquetes. Un intervalo instalaría lo más reciente de ese día.