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