AUTORÍA / PAQUETES
Del contenido al paquete .p2lrn
Un curso puede crearse visualmente con Studio o programáticamente con Toolkit. Esta guía se centra en el resultado común: cómo se organiza el paquete, cómo se construye y qué conviene comprobar antes de entregarlo al Player.
1. Dos caminos, un mismo resultado
Studio
Trabaja con unidades, lecciones y actividades desde una interfaz. Al terminar, descarga o guarda el archivo .p2lrn.
Toolkit
Construye el mismo tipo de paquete desde un workspace mediante API o CLI.
No es necesario repetir ambos recorridos. Elige la forma de autoría que corresponda a tu caso y utiliza las siguientes secciones para entender el paquete resultante.
2. Qué contiene un paquete
course.p2lrn
├─ META-INF/manifest.json
├─ content/graph.json
├─ assets/...
├─ packages/...
└─ multipart/...Identifica el paquete, declara perfiles y entrypoints y contiene la información de integridad.
Describe la estructura de curso, unidades, actividades, recursos y relaciones.
Contienen los recursos que viajan dentro del paquete cuando corresponde.
Describe recursos grandes distribuidos en partes externas verificadas.
3. Workspace de autoría
Cuando creas por código, el workspace es el proyecto editable y el .p2lrn es el artefacto que publicas. Conserva el workspace si quieres reconstruir o modificar el curso más adelante.
import {P2LRNAuthoringWorkspace} from '@p2lrn/toolkit/authoring';
const workspace = P2LRNAuthoringWorkspace.create('./workspace', {
title: 'Curso de seguridad básica',
language: 'es',
});Autoría y derechos
Si el curso debe identificar autor, fecha, licencia o titular de derechos, utiliza los metadatos portables del propio curso. Studio, Toolkit, Player y Reader comparten el mismo contrato.
workspace.setCourseRights({
author: 'Nombre del autor',
createdAt: '2026-10-26',
license: 'CC BY 4.0',
copyrightHolder: 'Titular de los derechos'
});Todos los campos son opcionales y sólo se guardan los que hayas definido. Para el esquema y sus límites consulta Formato P2LRN.
4. Añadir estructura y recursos
Las unidades organizan el curso y los recursos proporcionan el contenido que utilizan las actividades. Las claves devueltas por las funciones de autoría sirven para relacionar después progresión u otras reglas con las entidades reales.
workspace.addUnit({
key: 'unidad-1',
title: 'Unidad 1 · Fundamentos',
});
const intro = workspace.addFile({
source: './material/intro.html',
key: 'intro',
title: 'Introducción',
parent: 'unidad-1',
mediaType: 'text/html',
});Para documentos que primero deben analizarse, consulta Reader documental.
5. Añadir reglas opcionales
Si el curso necesita obligatoriedad, bloqueo o prerrequisitos, define esas reglas antes del build. La guía Progresión explica la diferencia entre completar una actividad y bloquear la navegación posterior.
6. Construir el paquete
Cuando la estructura y los recursos estén listos, construye el archivo portable que consumirá el Player.
workspace.build('./curso.p2lrn', {
strictProfiles: true,
});El build convierte el proyecto editable en el paquete portable que debe consumir el Player.
7. Validar e inspeccionar antes de publicar
Antes de entregar el curso, valida el paquete y revisa su estructura. No publiques un paquete que falle la validación.
p2lrn-validate curso.p2lrn
p2lrn-inspect curso.p2lrn
p2lrn-reader curso.p2lrnvalidate comprueba el contrato del paquete. inspect muestra su estructura. reader permite revisar el contenido desde las herramientas del Toolkit. Corrige cualquier error de validación antes de entregar el paquete.
8. Recursos grandes
Si un recurso grande no debe viajar dentro del archivo principal, utiliza Multipart. El descriptor mantiene los hashes y permite que el Player verifique las partes que necesita.
9. Siguiente paso
Continúa con Formato P2LRN para entender con más detalle manifest, graph, perfiles e integridad. Después puedes añadir Progresión y probar el resultado con el Player.