Definir módulos en modulemd
Simplemente pone, modulemd es un archivo que define que paquetes se crean para que versiones. Incluye un resumen y una descripción, una lista de los paquetes RPM fuente, información de compilación, es decir, orden de compilación y macros e información de utilización, esto es perfiles de instalación y licencias.
Un ejemplo típico de modulemd
Un archivo típico modulemd se ve similar a los siguientes ejemplos. Continúe leyendo para obtener más información sobre cada parte del archivo modulemd.
No dude en copiar/pegar este ejemplo cuando cree su nuevo módulo.
document: modulemd-packager
version: 3
data:
# === Information about this module ==================================
# (Can be copied from the main RPM package, but doesn't need to be)
summary: An example module
description: >-
A module for the demonstration of the metadata format. Also,
it can span multiple lines.
# === License of this modulemd file ==================================
license:
- MIT
# === Module context configurations ===========================================
# (For which Fedora releases to build?)
configurations:
# context:
# A string of up to ten [a-zA-Z0-9] characters representing a
# a build and runtime configuration for this stream. This string is
# arbitrary but must be unique in this module stream.
# Type: MANDATORY
- context: CTX1
# platform:
# Defines the distribution and release to build on and run against.
# Type: MANDATORY
platform: f32
# buildrequires:
# A dictionary of the build-time dependencies on other module streams.
# Each configuration may depend on a single stream of a dependency.
# The dictionary key is the name of the module and the dictionary value
# is a single-element list containing the name of the stream.
#
# Type: Optional
buildrequires:
appframework: [v1]
# requires:
# A dictionary of the run-time dependencies on other module streams.
# Each configuration may depend on a single stream of a dependency.
# The dictionary key is the name of the module and the dictionary value
# is a single-element list containing the name of the stream.
#
# Type: Optional
requires:
appframework: [v1]
# buildopts:
# Component build options
# Additional per component type module-wide build options.
#
# IMPORTANT: Due to limitations in the modulemd-stream v2 format, the
# buildopts from the first configuration in the list will apply to
# ALL configurations when building for modulemd-stream v2. They will
# apply separately when building for module-stream v3.
#
# Type: OPTIONAL
buildopts:
# rpms:
# RPM-specific build options
#
# Type: OPTIONAL
rpms:
# macros:
# Additional macros that should be defined in the
# RPM buildroot, appended to the default set. Care should be
# taken so that the newlines are preserved. Literal style
# block is recommended, with or without the trailing newline.
#
# Type: OPTIONAL
macros: |
%demomacro 1
%demomacro2 %{demomacro}23
# whitelist:
# Explicit list of package build names this module will produce.
# By default the build system only allows components listed under
# data.components.rpms to be built as part of this module.
# In case the expected RPM build names do not match the component
# names, the list can be defined here.
# This list overrides rather then just extends the default.
# List of package build names without versions.
#
# Type: OPTIONAL
whitelist:
- fooscl-1-bar
- fooscl-1-baz
- xxx
- xyz
# arches:
# Instructs the build system to only build the
# module on this specific set of architectures.
# Includes specific hardware architectures, not families.
# See the data.arch field in the modulemd-stream spec for details.
# Defaults to all available arches.
#
# Type: OPTIONAL
arches: [i686, x86_64]
# Alternate example with no dependencies
- context: CTX2
platform: f33
# === Module API (optional, but encouraged) ==========================
# (Which packages are API-stable?)
api:
rpms:
- package-one # <- Binary RPM package name
- package-one-extras # <- Binary RPM package name
- package-one-cli # <- Binary RPM package name
- package-one-devel # <- Binary RPM package name
- package-two # <- Binary RPM package name
# === Package filtering ==============================================
# (Which packages should not be included into the resulting module)
filter:
rpms:
- subpackage-one # <- Binary RPM package name
# === Installation profiles (optional, but encouraged) ===============
# (Helping users with installation by providing predefined groups)
profiles:
default: # <- Name of the profile
description: A standard installation.
rpms:
- package-one # <- Binary RPM package name
- package-one-extras # <- Binary RPM package name
- package-two # <- Binary RPM package name
cli: # <- Name of the profile
description: A command-line client.
rpms:
- package-one-cli # <- Binary RPM package name
# === Packages in this module ========================================
# (Referenced by their dist-git repo name + branch name)
components:
rpms:
first-package: # <- Source RPM package name
ref: 3.0 # <- Branch name in dist-git
rationale: Provides the core functionality.
second-package: # <- Source RPM package name
ref: latest # <- Branch name in dist-git
rationale: Web UI for the first-package.
Definiciones comunes de modulemd
Estas son las partes comunes de un archivo modulemd, usadas en el ejemplo anterior. Las definiciones avanzadas, incluyendo un complejo ejemplo de Module Stream Expansion (Módulo de Expansión de Flujo) (MSE), están hacia el final de esta página.
Cabecera del documento
Cada modulemd empieza con estas tres líneas:
document: modulemd-packager
version: 3
data:
... (1)
1 | Todas las siguientes definiciones van aquí, bajo data. |
Información sobre este módulo
Les dice a los usuarios lo que este módulo representa escribiendo un resumen y una descripción.
summary: An example module
description: >- (1)
A module for the demonstration of the metadata format. Also,
it can span multiple lines.
1 | >- significa nueva línea en YAML. ¡Útil para los bloques de texto más largos, como la descripción! |
Licencia para este archivo modulemd
Esta es una licencia de este mismo archivo modulemd y no es necesario modificarlo. El sistema de compilación añade licencias de todos los paquetes a esta lista automáticamente.
license:
- MIT (1)
1 | Una licencia para este archivo modulemd. Contenido de Fedora, como archivos SPEC o parches no incluidos por el desarrollador, usa de modo predeterminado la licencia MIT, a menos que el empaquetador del componente declare lo contrario. |
Configuraciones de contexto del módulo
Cada configuración de contexto describe como un flujo de módulo y sus componentes se deberían compilar y ejecutar. Un ejemplo de contexto sencillo:
configurations:
- context: CTX1 (1)
platform: f32 (2)
buildrequires:
appframework: [v1] (3)
requires:
appframework: [v1] (4)
1 | Un nombre de contexto para la sencilla configuración. |
2 | Se creará un identificador de una versión importante de una distribución en este contexto y se ejecutará. |
3 | Flujos de módulos para habilitar al construir este contexto (dependencias modulares en tiempo de compilación). |
4 | Flujos de módulos para habilitar al instalar este contexto (dependencias modulares en tiempo de ejecución). |
El campo context
es obligatorio y debe ser único dentro de un único flujo. El valor es una cadena arbitraria con una longitud y un alfabeto limitados. El valor de contexto se usa por DNF para establecer una ruta de actualización entre múltiples versiones de módulos y contextos. Por lo tanto, una vez establecido el valor, no debería cambiar.
El identificador de la plataforma es obligatorio y coincide con una versión Fedora. Por ejemplo`f32` significa Fedora 32. Rawhide usa también un valor numérico. Técnicamente, es un hilo del módulo platform
.
Las dependencias modulares en tiempo de ejecución pueden diferir de las de tiempo de compilación. Puede haber varios módulos enumerados, pero siempre exactamente una secuencia. Por ejemplo, appframework: [v1]
significa el flujo de módulo appframework:v1
.
A continuación se muestra un complejo ejemplo con múltiples contextos:
configurations:
- context: CTX1
platform: f32
buildrequires:
appframework: [v1]
requires:
appframework: [v1]
frameworkext: [v3]
- context: CTX2
platform: f33
buildrequires:
appframework: [v1]
requires:
appframework: [v1]
frameworkext: [v3]
- context: CTX3
platform: f33
buildrequires:
appframework: [v2]
requires:
appframework: [v2]
Este ejemplo producirá un módulo compilado para Fedora 32 y dos compilados para Fedora 33. El módulo Fedora 32 dependerá de appframework:v1
y frameworkext:v3
, mientras que el módulo Fedora 33 soportará los flujos appframework:v1` y appframework:v2
. El contexto CTX3
no dependen de frameworkext:v3
porque se fusionó con appframework:v2
.
Perfiles de instalación (opcional, pero recomendado)
Para ayudar a los usuarios a instalar su módulo, defina perfiles de instalación. Estos perfiles representan un caso de uso específico para su módulo. La mayoría de los módulos tienen al menos un perfil predeterminado. Pero puede especificar más. Por ejemplo, un módulo de base de datos puede tener un perfil servidor y otro cliente.
profiles:
default: (1)
description: A standard installation. (2)
rpms:
- package-one (3)
- package-one-extras (3)
- package-two (3)
cli:
description: A command-line client.
rpms:
- package-one-cli
... (4)
1 | Nombre del perfil. |
2 | Un rápido resumen del perfil. |
3 | Paquetes binarios a instalar con este perfil. |
4 | Enumere tanto perfiles como necesite. |
Módulo API (Interfaz de Aplicación de Programación) (opcional, pero recomendado)
Enumere todos los paquetes RPM binarios en su módulo que considere la principal característica estable del módulo. Otros paquetes (no listados) deben considerarse no compatibles o un detalle de implementación.
api:
rpms:
- package-one
- package-one-extras
- package-one-cli
- package-one-devel
- package-two
Paquetes en este módulo
Enumere todos los paquetes SRPM fuente que este módulo debería incluir, haga la referencia por su nombre de repositorio dist-git repo name + el nombre de rama.
components:
rpms:
first-package: (1)
rationale: Provides the core functionality. (2)
ref: 3.0 (3)
second-package:
rationale: Web UI for the first-package.
ref: latest
... (4)
1 | Nombre del paquete — asignado a un nombre de repositorio DistGit. |
2 | La razón por la que este paquete esta aquí. Principalmente para humanos. |
3 | Rama, etiqueta o confirmación de DistGit — para que se incluya la versión correcta del paquete. |
4 | Enumere tantos paquetes como necesite. |
Definiciones avanzadas
Referencias al upstream (opcional)
Puede proporcionar referencias a la comunidad upstream, a documentación o a un rastreador de problemas.
references:
community: http://www.example.com/ (1)
documentation: http://www.example.com/ (2)
tracker: http://www.example.com/ (3)
1 | Sitio web de la comunidad upstream, si existe. |
2 | Documentación upstream, si existe. |
3 | Rastreador de errores upstream, si existe. |
Compilar en un orden específico (opcional)
Los paquetes se compilan en lotes. De modo predeterminado, todos los paquetes son parte de un único grupo y por lo tanto compilados concurrentemente.
Para compilar paquetes en un orden específico, los asigna a múltiples grupos de compilación. Los grupos de compilación se identifican por un entero. Los grupos con números más bajos se compilan primero. Se permiten los valores negativos, 0 es el valor implícito predeterminado.
En este ejemplo específico, first-package
se compila primero y second-package
se compila segundo.
components:
rpms:
first-package:
rationale: Provides the core functionality.
ref: 3.0
buildorder: 0 (1)
second-package:
rationale: Web UI for the first-package.
ref: latest
buildorder: 10 (1)
1 | Número del grupo de compilación. |
Para escenarios incluso más complejos, estudie la especificación modulemd-packager.
Macros RPM (opcional)
Los paquetes RPM mientras están siendo compilados como parte de un módulo tienen las siguientes macros RPM disponibles:
%dist .scrmod+f37+14301+76d220e4 (1) %modularitylabel perl-Module-Install:master:3720220414092112:dd3c6e0e (2) %_module_build 1 (3) %_module_name perl-Module-Install (4) %_module_stream master (5) %_module_version 3720220414092112 (6) %_module_context dd3c6e0e (7)
1 | Una macro %dist de un valor único usada en las etiquetas de especificación Release RPM. <.> Una etiqueta RPM almacenada en paquetes RPM binarios. DNF la usa para distinguir entre paquetes modules y no modulares. <.> Una macro que denota que se está compilando un paquete modular. <.>Un nombre del módulo que está siendo compilado. <.> Un flujo del módulo que está siendo compilado. <.> Una versión del módulo que está siendo compilado. <.> Contexto del módulo que está siendo compilado. |
Puede usar estas macros en los archivos de especificación RPM de sus componentes RPM para modificar la compilación de los paquetes.
Si necesita macros RPM adicionales, los puede definir en una sección buildopts
de su archivo modulemd:
buildopts:
rpms:
macros: |
%perl_bootstrap 1
Esta sección pertenece a un elemento de la lista configurations
en el caso del formato v3 modulemd. En el caso del formato v2 pertenece directamente a la sección data
.
Paquetes Filtrados (opcional, predeterminado sin filtros)
El proceso de compilación de paquetes RPM puede resultar en unos subpaquetes que complementan la compilación del paquete (documentos, requerimientos adicionales de compilación etc.). Un paquete RPM fuente puede producir múltiples paquetes RPM binarios. Estos subpaquetes no siempre se desea que se envíen con el Módulo. Los módulos le habilitan para filtrar estos paquetes no deseables con la opción de compilación filter
. Después de que finalice la compilación los paquetes filtrados no serán incluidos en la propiedad artifacts
en el archivo modulemd yaml resultante. La propiedad artifacts
se añade por el sistema de compilación después de la compilación. Vea un ejemplo en archivos de especificaciones modulemd.
Los RPMs filtrados aún están disponibles como dependencias de compilación en las subsiguientes etapas de la compilación del módulo, pero no se incluyen en el repositorio compuesto para los usuarios.
filter:
rpms:
- first-package-debuginfo
- second-package-nope
Paquetes desmodularizados (opcional, predeterminado ninguno)
Si usted decide eliminar un paquete binario de su secuencia del módulo, probablemente dejara de compilarlo o lo filtrará con una opción filter
. Pero no es suficiente si desea mover el paquete a paquetes no modulares: Puesto que el paquete permanece listado entre los artefactos en la versión previa de la secuencia y un administrador de paquetes podría ver tanto la versión actualizada como la histórica. (La versión anterior puede estar disponible en los repositorios GA y updates, mientras que su módulo actualizado aparecerá primero en un repositorio updates-testing.)
Para devolver el paquete al conjunto de paquetes no modulares, debe escribirlo en una lista de paquetes desmodularizados. Un administrador de paquetes comprueba la lista desmodularizada de la última versión de la secuencia del módulo en todos los repositorios y si solo ve un nombre de paquete allí, dejará de ocultar los paquetes no modulares con el mismo nombre mientras la secuencia esté habilitada.
La lista de los paquetes desmodularizados se define en el campo demodularized
:
demodularized:
rpms:
- first-removed-package
- second-removed-package
Con este mecanismo explícito, llamado desmodularización, un paquete puede ser degradado de un módulo. Si en algún momento revierte su decisión y hace al paquete modular otra vez, lo único necesario es eliminarlo de la lista de desmodularizados.
Crear componentes solo compilación (opcional)
Además de filtrar subpaquetes, es posible filtrar todos los artefactos producidos por un componente en un módulo. Esto es útil en los casos en que los paquetes principales de su módulo tienen una dependencia en tiempo de compilación que desea enviar. Un ejemplo de tal caso sería si necesita compilar con un generador de documentación especialmente parcheado que entraría en conflicto con la versión predeterminada usada en Fedora.
components:
rpms:
customdocgen:
rationale: A patched version of docgen that enables an experimental feature.
ref: experimental
buildorder: 0
buildonly: 1
myapp:
rationale: My application
ref: latest
buildorder: 10
En este ejemplo, customdocgen
se compilaría primero y estaría disponible en buildroot para que myapp
lo use durante su compilación. Una vez que la construcción del módulo finaliza y se componen en el repositorio DNF, solo los artefactos no filtrados de myapp
estarán disponibles. Todos los artefactos customdocgen
se añadirán automáticamente a la sección data.filters.rpms
de los metadatos del módulo.
Un modulemd mínimo
Un mínimo absoluto
Este módulo incluye dos paquetes RPM fuente creados para las versiones Fedora 35.
document: modulemd-packager
version: 3
data:
summary: An example module
description: >-
A module for the demonstration of the metadata format.
license:
- MIT
configurations:
- context: CTX1
platform: f35
components:
rpms:
first-package:
rationale: Provides the core functionality.
ref: 3.0
second-package:
rationale: Web UI for the first-package.
ref: latest
Incluir perfiles y API (recomendado)
Este módulo incluye dos paquetes RPM fuente creados para las versiones Fedora 35. Aclara que paquetes se consideran API y ayuda a los usuarios con la instalación gracias a los perfiles.
document: modulemd-packager
version: 3
data:
summary: An example module
description: >-
A module for the demonstration of the metadata format.
license:
- MIT
configurations:
- context: CTX1
platform: f35
api:
rpms:
- package-one
- package-one-extras
- package-one-cli
- package-one-devel
- package-two
profiles:
default:
description: A standard installation.
rpms:
- package-one
- package-one-extras
- package-two
cli:
description: A command-line client.
rpms:
- package-one-cli
components:
rpms:
first-package:
rationale: Provides the core functionality.
ref: 3.0
second-package:
rationale: Web UI for the first-package.
ref: latest
Want to help? Learn how to contribute to Fedora Docs ›