Перейти к содержимому
getnextpdf.com

Enterprise редакция

Release — глубокий справочник

Пространство имён NextPDF\Enterprise\Release моделирует выпуск продукта как неизменяемые типизированные объекты-значения. Его публичная поверхность — семь final-классов и пять перечислений на основе строк. ReleaseManifest агрегирует записи ArtifactManifest по каждому артефакту плюс пути к доказательствам цепочки поставок. BuildProfile — единственный источник истины для одного варианта артефакта. ArtifactNamer и PackageMapping выводят детерминированные имена файлов и идентичность пакета Composer из профиля. PublishingPlan::fromProfiles разрешает каждый профиль в типизированные записи PublishingTarget с правильным каналом и границей доступа. ReleaseStatus типизирует жизненный цикл выпуска. Модуль не выполняет ввода-вывода, сетевых вызовов и криптографии; это чистое моделирование метаданных.

Эта возможность поставляется в составе NextPDF Enterprise (nextpdf/enterprise) и активируется лицензионным конвертом уровня Enterprise. Развёртывание без такого права не загружает классы возможности. Сравните редакции и получите лицензию.

Эта поверхность лицензируется границей пакета nextpdf/enterprise и не имеет отдельного кода возможности для каждой функции. Core и Pro не поставляют слой моделирования выпусков.

Окно терминала
composer require nextpdf/enterprise:^3
СимволПараметрыПоведение по умолчаниюВозвращаетБросает или завершается сПримечания
ReleaseManifest::__constructversion, sourceCommit, builtAt, artifacts = [], sbomPath = null, gpgSignature = null, checksumPath = nullСоздаёт неизменяемый документ выпуска верхнего уровняэкземплярfinal readonly; SCHEMA_VERSION равно '1.0'; minor для добавляемых полей, major для несовместимых; начиная с 3.0.0
ReleaseManifest::createWithDefaultsstring $version, string $sourceCommit, DateTimeImmutable $builtAt, array $artifacts = []Предварительно задаёт имена файлов SBOM, подписи и контрольной суммы по умолчанию через ArtifactNamerselfКанонная точка входа для сборщиков выпуска; используйте конструктор, чтобы переопределить отдельные пути
ReleaseManifest::toArray / ::toJsonнетСериализует манифест со всеми записями артефактовarray / строка JSONtoJson: JsonException при ошибке кодированияС отступами, без экранирования слэшей; built_at в формате ATOM
ReleaseManifest::validateнетПроверяет, что список артефактов не пуст и каждый артефакт соответствует версии и коммиту выпускаlist<string> ошибок; пустой означает валидностьНикогда не бросаетВызывающий код должен считать непустой список дефектом
ArtifactManifest::__constructfilename, version, sourceCommit, edition, deliveryMode, encodingTechnology, channel, phpTarget, sha256, ioncubeExpire, builtAtФиксирует один собранный артефакт: что собрано, как и как это проверитьэкземплярfinal readonly; ioncubeExpire равно null для неистекающих артефактов
ArtifactManifest::fromProfileBuildProfile $profile, string $version, string $sourceCommit, string $sha256, ?DateTimeImmutable $builtAt = nullВыводит имя файла и все измерения профиляselfbuiltAt по умолчанию — текущее время
ArtifactManifest::toArrayнетСериализует для кодирования в JSONarray<string, string|null>Поля-перечисления сериализуются в свои строковые значения
BuildProfile::__construct / ::fromArrayполя профиля / array $dataОпределяет один вариант артефакта; единственный источник истины для именования, манифеста и планаэкземпляр / selffromArray: InvalidArgumentException при отсутствующем или пустом обязательном полеОбязательные ключи: name, edition, delivery, encoding_technology, channel, php_target
BuildProfile::requiresEncoding / ::isEvaluationнетПредикатные помощники над измерениями профиляboolКодирование требует одновременно DeliveryMode::Encoded и EncodingTechnology::IonCube
ArtifactNamer::formatBuildProfile $profile, string $versionВыдаёт nextpdf-{edition}-{delivery}-{channel}-php{target}-{version}.zipnon-empty-stringДетерминированно; точки удаляются из целевой версии PHP (8.4 становится php84)
ArtifactNamer::checksumFile / ::signatureFile / ::sbomFile / ::manifestFilestring $version (manifestFile: нет)Выдаёт SHA256SUMS-{v}.txt, SHA256SUMS-{v}.txt.asc, sbom-{v}.cdx.json, release-manifest.jsonnon-empty-stringИмя файла SBOM совпадает с документом CycloneDX, который пишет генератор SBOM ядра Core
PackageMapping::packageName / ::resolvePackageNameBuildProfile / LicenseEdition + LicenseChannelСопоставляет с nextpdf/pro или nextpdf/enterprise; ознакомительный канал добавляет -evaluationnon-empty-stringInvalidArgumentException при неизвестной редакцииОтдельное пространство имён для ознакомления предотвращает смешение с платными артефактами
PackageMapping::distUrlPatternBuildProfile $profile, string $versionРазрешает URL загрузки артефакта в каноническом репозитории артефактовnon-empty-stringКодированный и открытый вариант используют одно имя пакета; их dist-URL различаются
PackageMapping::accessBoundary / ::artifactOrigin / ::consumptionChannel / ::allPackageNamesBuildProfile / нет / нет / нетГраница следует за каналом лицензии; фиксированные каналы источника и потребления; все клиентские имена пакетовAccessBoundary / DistributionChannel / DistributionChannel / list<non-empty-string>Core не является премиум-пакетом и исключён из списка имён
PublishingPlan::fromProfilesarray $profiles, string $version, PublishingEnvironment $environment = StagingРазрешает две цели на профиль: одну — источник артефакта, одну — слой потребленияselfОкружение по умолчанию — Staging; production всегда явный выбор
PublishingPlan::targetsByBoundary / ::targetsByChannel / ::packageNamesAccessBoundary / DistributionChannel / нетПомощники фильтрации и перечисления над разрешёнными целямиlist<PublishingTarget> / list<PublishingTarget> / list<non-empty-string>packageNames отсортирован и без дубликатов
PublishingPlan::validateнетПроверяет, что цели не пусты, версии совпадают с планом и ни один ознакомительный пакет не находится в платной границеlist<string> ошибок; пустой означает валидностьНикогда не бросаетЗапускайте перед любым шагом загрузки
PublishingPlan::toArrayнетСериализует для вывода dry-run и журналированияarray<string, mixed>Включает target_count и список пакетов
PublishingTarget::fromProfileBuildProfile $profile, string $version, PublishingEnvironment $environment, DistributionChannel $channelРазрешает имя пакета, границу доступа и имя файла артефакта для одного каналаselffinal readonly; toArray сериализует для журналирования
AccessBoundaryперечисление: Paid, Evaluation, InternalisCustomerFacing равно true только для Paid и Evaluationна основе 'paid', 'evaluation', 'internal'requiresAuthentication возвращает true для каждой границы
DistributionChannelперечисление: GitHubReleases, PrivatePackagist, DirectDownloadisArtifactOrigin и isConsumptionLayer разделяют две ролина основе 'github_releases', 'private_packagist', 'direct_download'DirectDownload зарезервирован для будущего канала с подписанными URL
EncodingTechnologyперечисление: IonCube, NoneИменует инструмент кодирования, отдельно от формы доставкина основе 'ioncube', 'none'Артефакт в открытом тексте всегда сообщает None
PublishingEnvironmentперечисление: Staging, ProductionisCustomerFacing равно true только для Productionна основе 'staging', 'production'Staging — внутренняя цель проверки
ReleaseStatusперечисление: Built, Audited, Staged, Published, Revoked, SupersededcanPromote, nextStatus, isCustomerVisible, isTerminal типизируют жизненный циклnextStatus возвращает ?selfЦепочка продвижения Built → Audited → Staged → Published; Revoked и Superseded терминальны

Сигнатуры точек входа, дословно из исходного кода:

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
  • Каждый класс final; каждый класс-значение readonly. Конструирование фиксирует всё состояние. Модуль не выполняет операций с файловой системой, сетью или криптографией.
  • ReleaseManifest — неизменяемый документ верхнего уровня для версии: семантическая версия, исходный коммит, временная метка сборки, список артефактов и необязательные пути к доказательствам цепочки поставок (SBOM, подпись GPG, контрольные суммы). Версия схемы — minor для добавлений и major для несовместимых изменений.
  • BuildProfile — единственный источник истины о том, что содержит артефакт и как он упакован. Именование, манифест и план выводятся из профиля; вторичного источника конфигурации нет.
  • EncodingTechnology именует инструмент кодирования; DeliveryMode (из модуля Licensing) именует форму доставки. Эти два понятия намеренно разделены, и артефакт в открытом тексте всегда сообщает EncodingTechnology::None.
  • DistributionChannel разделяет источник артефакта (двоичное хранилище; место назначения загрузки) и слой потребления пакета (реестр, который читает composer require). Источник хранит двоичный файл; слой потребления отдаёт метаданные, указывающие на него.
  • AccessBoundary перечисляет Paid, Evaluation и Internal. Каждая граница требует аутентификации. Артефакты Internal обслуживают CI, QA и staging и никогда не предназначены для клиента.
  • PublishingPlan::fromProfiles разрешает каждый профиль ровно в две цели: цель источника артефакта и цель слоя потребления, при этом граница доступа выводится из канала лицензии профиля, чтобы платные и ознакомительные артефакты маршрутизировались корректно.
  • План описывает предполагаемые цели, а не транспорт. Фактическую загрузку выполняет окружающий инструментарий выпуска, а манифест фиксирует — но сам не создаёт — доказательства цепочки поставок.
  • ReleaseStatus типизирует жизненный цикл: Built → Audited → Staged → Published, где Revoked и Superseded — терминальные выходы из Published. Только Published виден клиенту; canPromote равно false, начиная с Published.
  • ReleaseManifest::validate и PublishingPlan::validate сообщают об ошибках согласованности списками строк и никогда не бросают исключений. Пустой список — единственный валидный результат.
  • BuildProfile::fromArray с отсутствующим, нестроковым или пустым обязательным полем: InvalidArgumentException с указанием поля.
  • BuildProfile::fromArray с пустым или нестроковым ioncube_expire: нормализуется в null (без истечения). Нестроковые или пустые записи в encode_paths и exclude_paths тихо отбрасываются.
  • PackageMapping::resolvePackageName с редакцией вне известной карты: InvalidArgumentException.
  • ReleaseManifest::toJson на некодируемых данных: JsonException. Сериализация использует JSON_THROW_ON_ERROR; тихого запасного варианта нет.
  • ReleaseManifest::validate сообщает об ошибках при пустом списке артефактов и о любом артефакте, чья версия или исходный коммит отличаются от выпуска.
  • PublishingPlan::validate сообщает о пустом списке целей, любой версии цели, расходящейся с планом, и любом ознакомительном пакете, попавшем в платную границу.
  • ReleaseStatus::nextStatus возвращает null из Published, Revoked и Superseded. Вызывающий код должен обрабатывать null; зацикливания нет.
  • Каналы источника и слоя потребления различны; не направляйте composer require на источник артефакта.
  • Артефакты с границей Internal никогда не предназначены для клиента; их маршрутизация в клиентский канал — явная ошибка моделирования.
  • Этот модуль не выполняет криптографических операций. Подписание GPG и генерация контрольных сумм являются внешними и здесь только упоминаются.

Соответствие стандартам для этого модуля не заявляется; это слой моделирования выпусков, и NextPDF не имеет сертификации. Имя файла SBOM по умолчанию (sbom-{version}.cdx.json) совпадает с документом CycloneDX, который пишет генератор SBOM ядра Core; манифест ссылается на это доказательство и не проверяет его. Подписи GPG и контрольные суммы создаются и проверяются окружающим конвейером выпуска. Запись пути к доказательству — это возможность, а не аттестация: манифест сам по себе не является доказательством, не подтверждает происхождение, не сертифицирует выпуск и не является юридической консультацией.

  • Предпочитайте ReleaseManifest::createWithDefaults, чтобы имена файлов доказательств всегда согласовывались с ArtifactNamer. Оставляйте прямой конструктор для намеренного переопределения отдельных путей.
  • Запускайте оба гейта validate() в CI перед любым шагом публикации и завершайте конвейер с ошибкой при непустом списке ошибок.
  • PublishingPlan::fromProfiles по умолчанию использует PublishingEnvironment::Staging. Передавайте Production явно; ничто в этом модуле не продвигает окружение неявно.
  • Сериализованные манифесты несут строковые значения перечислений (paid, encoded, ioncube и так далее) и временные метки ATOM; относитесь к этим строкам как к сетевому контракту.
  • Ознакомительные артефакты живут в отдельном пространстве имён пакетов (суффикс -evaluation). Держите платные и ознакомительные реестры раздельно в конфигурации Composer.
  • Маршрутизация по каналам, учётные данные и хранение — ответственность оператора. План сообщает инструментарию, куда относится артефакт, а не как к нему аутентифицироваться.

Эта страница документирует только внешне наблюдаемое поведение и поддерживаемую поверхность публичного API. Внутренние пути пространств имён, вспомогательные классы, таблицы механизмов, имена файлов runbook и префиксы тикетов вне области рассмотрения.