Ir al contenido
getnextpdf.com

Enterprise edición

Publicación de versiones — Referencia detallada

El espacio de nombres NextPDF\Enterprise\Release modela un release de producto como objetos de valor inmutables y tipados. Su superficie pública son siete clases final y cinco enumeraciones respaldadas por cadenas. ReleaseManifest agrega entradas ArtifactManifest por artefacto, además de las rutas de evidencia de la cadena de suministro. BuildProfile es la única fuente de verdad para una variante de artefacto. ArtifactNamer y PackageMapping derivan nombres de archivo deterministas y la identidad del paquete de Composer a partir de un perfil. PublishingPlan::fromProfiles resuelve cada perfil en entradas PublishingTarget tipadas con el canal y el límite de acceso correctos. ReleaseStatus tipa el ciclo de vida del release. El módulo no realiza E/S, ni llamadas de red, ni criptografía; es puro modelado de metadatos.

Esta funcionalidad se distribuye en NextPDF Enterprise (nextpdf/enterprise) y se activa con un sobre de licencia de nivel Enterprise. Un despliegue sin ese derecho no carga las clases de la funcionalidad. Comparar ediciones y obtener una licencia.

Esta superficie se licencia mediante el límite del paquete nextpdf/enterprise y no tiene un código de funcionalidad separado por característica. Core y Pro no incluyen una capa de modelado de releases.

Ventana de terminal
composer require nextpdf/enterprise:^3
SímboloParámetrosComportamiento predeterminadoDevuelveLanza o falla conNotas
ReleaseManifest::__constructversion, sourceCommit, builtAt, artifacts = [], sbomPath = null, gpgSignature = null, checksumPath = nullConstruye el documento de release de nivel superior inmutableinstanciafinal readonly; SCHEMA_VERSION es '1.0'; minor para campos aditivos, major para rupturas; desde 3.0.0
ReleaseManifest::createWithDefaultsstring $version, string $sourceCommit, DateTimeImmutable $builtAt, array $artifacts = []Preconfigura los nombres de archivo predeterminados de SBOM, firma y checksum mediante ArtifactNamerselfPunto de entrada canónico para los constructores de release; usar el constructor para anular rutas individuales
ReleaseManifest::toArray / ::toJsonningunoSerializa el manifiesto con todas las entradas de artefactoarray / cadena JSONtoJson: JsonException si falla la codificaciónCon formato legible, barras sin escapar; built_at en formato ATOM
ReleaseManifest::validateningunoComprueba que la lista de artefactos no esté vacía y que cada artefacto coincida con la versión y el commit del releaselist<string> de errores; vacía significa válidoNunca lanzaQuien la invoque debe tratar una lista no vacía como un defecto
ArtifactManifest::__constructfilename, version, sourceCommit, edition, deliveryMode, encodingTechnology, channel, phpTarget, sha256, ioncubeExpire, builtAtRegistra un artefacto compilado: qué se compiló, cómo y cómo verificarloinstanciafinal readonly; ioncubeExpire es null para artefactos sin caducidad
ArtifactManifest::fromProfileBuildProfile $profile, string $version, string $sourceCommit, string $sha256, ?DateTimeImmutable $builtAt = nullDeriva el nombre de archivo y todas las dimensiones del perfilselfbuiltAt toma por defecto la hora actual
ArtifactManifest::toArrayningunoSerializa para la codificación JSONarray<string, string|null>Los campos de enumeración se serializan a sus valores de cadena de respaldo
BuildProfile::__construct / ::fromArraycampos de perfil / array $dataDefine una variante de artefacto; la única fuente de verdad para la nomenclatura, el manifiesto y el planinstancia / selffromArray: InvalidArgumentException si falta un campo obligatorio o está vacíoClaves obligatorias: name, edition, delivery, encoding_technology, channel, php_target
BuildProfile::requiresEncoding / ::isEvaluationningunoAyudantes de predicado sobre las dimensiones del perfilboolLa codificación requiere DeliveryMode::Encoded y EncodingTechnology::IonCube juntos
ArtifactNamer::formatBuildProfile $profile, string $versionEmite nextpdf-{edition}-{delivery}-{channel}-php{target}-{version}.zipnon-empty-stringDeterminista; los puntos se eliminan del target de PHP (8.4 se convierte en php84)
ArtifactNamer::checksumFile / ::signatureFile / ::sbomFile / ::manifestFilestring $version (manifestFile: ninguno)Emite SHA256SUMS-{v}.txt, SHA256SUMS-{v}.txt.asc, sbom-{v}.cdx.json, release-manifest.jsonnon-empty-stringEl nombre de archivo del SBOM coincide con el documento CycloneDX que escribe el generador de SBOM de Core
PackageMapping::packageName / ::resolvePackageNameBuildProfile / LicenseEdition + LicenseChannelAsigna a nextpdf/pro o nextpdf/enterprise; el canal de evaluación añade -evaluationnon-empty-stringInvalidArgumentException ante una edición desconocidaEl espacio de nombres de evaluación separado evita mezclarse con artefactos de pago
PackageMapping::distUrlPatternBuildProfile $profile, string $versionResuelve la URL de descarga del artefacto en el repositorio de artefactos canóniconon-empty-stringEl artefacto codificado y el de texto claro comparten un nombre de paquete; sus URL de dist difieren
PackageMapping::accessBoundary / ::artifactOrigin / ::consumptionChannel / ::allPackageNamesBuildProfile / ninguno / ninguno / ningunoEl límite sigue el canal de licencia; canales de origen y de consumo fijos; todos los nombres de paquete de cara al clienteAccessBoundary / DistributionChannel / DistributionChannel / list<non-empty-string>Core no es un paquete premium y se excluye de la lista de nombres
PublishingPlan::fromProfilesarray $profiles, string $version, PublishingEnvironment $environment = StagingResuelve dos destinos por perfil: un origen de artefacto y una capa de consumoselfEl entorno toma por defecto Staging; la producción es siempre una elección explícita
PublishingPlan::targetsByBoundary / ::targetsByChannel / ::packageNamesAccessBoundary / DistributionChannel / ningunoAyudantes de filtrado y enumeración sobre los destinos resueltoslist<PublishingTarget> / list<PublishingTarget> / list<non-empty-string>packageNames está ordenada y sin duplicados
PublishingPlan::validateningunoComprueba que los destinos no estén vacíos, que las versiones coincidan con el plan y que ningún paquete de evaluación se ubique en un límite de pagolist<string> de errores; vacía significa válidoNunca lanzaEjecutar antes de cualquier paso de subida
PublishingPlan::toArrayningunoSerializa para la salida de dry-run y el registroarray<string, mixed>Incluye target_count y la lista de paquetes
PublishingTarget::fromProfileBuildProfile $profile, string $version, PublishingEnvironment $environment, DistributionChannel $channelResuelve el nombre del paquete, el límite de acceso y el nombre de archivo del artefacto para un canalselffinal readonly; toArray serializa para el registro
AccessBoundaryenum: Paid, Evaluation, InternalisCustomerFacing es true solo para Paid y Evaluationrespaldado por 'paid', 'evaluation', 'internal'requiresAuthentication devuelve true para todos los límites
DistributionChannelenum: GitHubReleases, PrivatePackagist, DirectDownloadisArtifactOrigin e isConsumptionLayer separan los dos rolesrespaldado por 'github_releases', 'private_packagist', 'direct_download'DirectDownload está reservado para un futuro canal de URL firmada
EncodingTechnologyenum: IonCube, NoneNombra la herramienta de codificación, distinta de la forma de entregarespaldado por 'ioncube', 'none'Un artefacto de texto claro siempre informa None
PublishingEnvironmentenum: Staging, ProductionisCustomerFacing es true solo para Productionrespaldado por 'staging', 'production'Staging es un destino de verificación interno
ReleaseStatusenum: Built, Audited, Staged, Published, Revoked, SupersededcanPromote, nextStatus, isCustomerVisible, isTerminal tipan el ciclo de vidanextStatus devuelve ?selfCadena de promoción Built → Audited → Staged → Published; Revoked y Superseded son terminales

Firmas de los puntos de entrada, textuales de la fuente:

public static function createWithDefaults(string $version, string $sourceCommit, DateTimeImmutable $builtAt, array $artifacts = []): self
public static function fromProfile(BuildProfile $profile, string $version, string $sourceCommit, string $sha256, ?DateTimeImmutable $builtAt = null): self
public static function fromArray(array $data): self
public static function format(BuildProfile $profile, string $version): string
public static function fromProfiles(array $profiles, string $version, PublishingEnvironment $environment = PublishingEnvironment::Staging): self
public static function fromProfile(BuildProfile $profile, string $version, PublishingEnvironment $environment, DistributionChannel $channel): self
  • Cada clase es final; cada clase de valor es readonly. La construcción fija todo el estado. El módulo no realiza operaciones de sistema de archivos, de red ni criptográficas.
  • ReleaseManifest es el documento de nivel superior inmutable de una versión: versión semántica, commit de origen, marca de tiempo de compilación, lista de artefactos y rutas opcionales de evidencia de la cadena de suministro (SBOM, firma GPG, checksums). Su versión de esquema es minor para aditivos y major para rupturas.
  • BuildProfile es la única fuente de verdad de lo que contiene un artefacto y de cómo se empaqueta. La nomenclatura, el manifiesto y el plan derivan todos del perfil; no hay una fuente de configuración secundaria.
  • EncodingTechnology nombra la herramienta de codificación; DeliveryMode (del módulo de Licensing) nombra la forma entregada. Ambas están deliberadamente separadas, y un artefacto de texto claro siempre informa EncodingTechnology::None.
  • DistributionChannel separa un origen de artefacto (almacenamiento del binario; el destino de subida) de una capa de consumo de paquetes (el registro que lee un composer require). El origen almacena el binario; la capa de consumo sirve los metadatos que apuntan a él.
  • AccessBoundary enumera Paid, Evaluation e Internal. Todos los límites requieren autenticación. Los artefactos internos sirven a CI, QA y staging y nunca son de cara al cliente.
  • PublishingPlan::fromProfiles resuelve cada perfil en exactamente dos destinos: un destino de origen de artefacto y un destino de capa de consumo, con el límite de acceso derivado del canal de licencia del perfil para que los artefactos de pago y de evaluación se enruten correctamente.
  • El plan describe los destinos previstos, no el transporte. La subida real la realiza el utillaje de release circundante, y el manifiesto registra —pero no produce por sí mismo— la evidencia de la cadena de suministro.
  • ReleaseStatus tipa el ciclo de vida: Built → Audited → Staged → Published, con Revoked y Superseded como salidas terminales desde Published. Solo Published es visible para el cliente; canPromote es false a partir de Published.
  • ReleaseManifest::validate y PublishingPlan::validate informan los errores de consistencia como listas de cadenas y nunca lanzan. Una lista vacía es el único resultado válido.
  • BuildProfile::fromArray con un campo obligatorio ausente, no textual o vacío: InvalidArgumentException que nombra el campo.
  • BuildProfile::fromArray con un ioncube_expire vacío o no textual: se normaliza a null (sin caducidad). Las entradas no textuales o vacías en encode_paths y exclude_paths se descartan silenciosamente.
  • PackageMapping::resolvePackageName con una edición fuera del mapa conocido: InvalidArgumentException.
  • ReleaseManifest::toJson con datos no codificables: JsonException. La serialización usa JSON_THROW_ON_ERROR; no hay una alternativa silenciosa.
  • ReleaseManifest::validate informa como errores una lista de artefactos vacía y cualquier artefacto cuya versión o commit de origen difiera del release.
  • PublishingPlan::validate informa una lista de destinos vacía, cualquier versión de destino que diverja del plan y cualquier paquete de evaluación resuelto en un límite de pago.
  • ReleaseStatus::nextStatus devuelve null desde Published, Revoked y Superseded. Quien la invoque debe gestionar null; no hay ciclo de retorno.
  • Los canales de origen y de capa de consumo son distintos; no apuntar un composer require al origen del artefacto.
  • Los artefactos con límite interno nunca son de cara al cliente; enrutarlos a un canal de cliente es un error de modelado explícito.
  • Este módulo no realiza operaciones criptográficas. La firma GPG y la generación de checksums son externas y aquí solo se referencian.

No se reclama conformidad con ningún estándar para este módulo; es una capa de modelado de releases, y NextPDF no posee ninguna certificación. El nombre de archivo predeterminado del SBOM (sbom-{version}.cdx.json) coincide con el documento CycloneDX que escribe el generador de SBOM de Core; el manifiesto referencia esa evidencia y no la valida. Las firmas GPG y los checksums los produce y verifica el pipeline de release circundante. Registrar una ruta de evidencia es una capacidad, no una atestación: un manifiesto no es prueba por sí mismo, no atestigua la procedencia, no certifica un release y no constituye asesoramiento legal.

  • Preferir ReleaseManifest::createWithDefaults para que los nombres de archivo de evidencia coincidan siempre con ArtifactNamer. Reservar el constructor sin procesar para anulaciones deliberadas por ruta.
  • Ejecutar ambas comprobaciones validate() en CI antes de cualquier paso de publicación y hacer fallar el pipeline ante una lista de errores no vacía.
  • PublishingPlan::fromProfiles toma por defecto PublishingEnvironment::Staging. Pasar Production explícitamente; nada en este módulo promueve un entorno de forma implícita.
  • Los manifiestos serializados llevan valores de respaldo de enumeración (paid, encoded, ioncube, etc.) y marcas de tiempo ATOM; tratar esas cadenas como el contrato de transmisión.
  • Los artefactos de evaluación residen en un espacio de nombres de paquete separado (sufijo -evaluation). Mantener distintos los registros de pago y de evaluación en la configuración de Composer.
  • El enrutamiento por canal, las credenciales y el almacenamiento son responsabilidad del operador. El plan le indica al utillaje dónde pertenece un artefacto, no cómo autenticarse ante él.

Esta página documenta únicamente el comportamiento observable externamente y la superficie de API pública admitida. Las rutas de espacios de nombres internos, las clases auxiliares, las tablas de mecanismos, los nombres de archivo de runbook y los prefijos de ticket quedan fuera del alcance.