Repository navigation
perf(build): не архивировать файлы компонента в .preserved.zip при установке (#783) - #784
Merged
Merged
Conversation
…783) core/ and assets/ travelled as file resolvers on the category vehicle, so they inherited PRESERVE_PREEXISTING and every upgrade zipped the installed core/components/minishop3 — 4248 files. That archive is write-only: xPDO unpacks it solely under RESTORE_PREEXISTING, a mode nothing in xPDO or MODX ever sets. The mode cannot be narrowed in place. Setting it on the category vehicle would also change how its objects behave on uninstall, and excluding vendor/ from the resolver would not help either: _pack() archives the target directory on the site, not the source. Upgrade on a warm filesystem cache, same package, three runs each: before 3.09 / 4.58 / 3.10 s, two archives written after 2.16 / 2.19 / 2.21 s, none Removal on uninstall is unchanged: xPDOFileVehicle deletes the target tree unless UNINSTALL_FILES says otherwise, exactly as the resolver did. The file vehicles are registered before the category so the PHP resolvers still find vendor/autoload.php on disk.
…ody reads the archive Review caught a wrong premise. RESTORE_PREEXISTING is not dead code: the uninstall dialog offers it as preexisting_mode=2 (manager/assets/modext/workspace/ package.windows.js) and Processors/Workspace/Packages/Uninstall.php passes the choice straight into the vehicle options. I had grepped for the constant name and missed that the value arrives as a bare integer from the UI. The change still stands, but as a deliberate trade-off: with no archive there is nothing to restore, and xPDOVehicle::get() merges the payload over the caller's options, so the pinned mode wins over the user's pick. "Restore" now rolls category objects back while the files are removed. It was already partial — Phinx migrations never roll back — and the archive cost every upgrade on every site. - Rewrite the packageFiles() docblock accordingly; drop the max_execution_time argument too, since modTransportPackage::install() already sets it to 0 and the real wall is a FastCGI or proxy timeout. - Record the behaviour change under [Unreleased] in both changelogs. - readLatestChangelogEntry() now skips [Unreleased], or package metadata would ship that heading instead of the installed version (#296). - BuildFileVehicleTest: the category-attributes guard never fired — [^\]]* stopped at the nested RELATED_OBJECT_ATTRIBUTES => [] and the key is spelled in upper case. Verified by mutation that it now fails. - New BuildChangelogMetadataTest covers the [Unreleased] skip and the TEXT limit.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Убирает архивацию
.preserved.zipпри установке и обновлении. Это ускоряет обновление примерно на треть ценой режима «Восстановить» при деинсталляции — сознательный размен, см. ниже.Что происходило
core/иassets/ехали file-резолверами на vehicle категории, то есть наследовали еёPRESERVE_PREEXISTING. На каждом обновлении xPDO зипует установленныйcore/components/minishop3целиком — 4248 файлов — в.preserved.zip.Что теряется
Первая редакция этого описания утверждала, что архив никто не читает. Это было неверно, спасибо за проверку.
Режим
RESTORE_PREEXISTINGприходит прямо из интерфейса: окно деинсталляции предлагает «Восстановить» сinputValue: 2(manager/assets/modext/workspace/package.windows.js), аProcessors/Workspace/Packages/Uninstall.phpпередаёт выбор в опции vehicle. Я искал по имени константы и не заметил, что значение приезжает из UI обычным числом.После этого PR:
xPDOVehicle::get()делаетarray_merge($options, $element), то есть зашитый в payload режим перекрывает выбор пользователя;Режимы «Сохранение» (по умолчанию) и «Деинсталлировать» не меняются: они и раньше удаляли файлы.
Считаю размен оправданным: этот откат и раньше был неполным, потому что Phinx-миграции не откатываются, а платили за архив все и на каждом обновлении. Но теперь это записано как есть — и в docblock, и в changelog.
Почему нельзя было точечно
xPDOTransport::_pack()архивирует целевой каталог на сайте, а не источник. Исключениеvendor/из копирования на архивацию не влияет.PREEXISTING_MODEобщий для всех резолверов vehicle. Поставить его на vehicle категории нельзя: он управляет и объектами — приREMOVE_PREEXISTINGони удаляются при деинсталляции вместо сохранения.vendorстал отдельным именем, — это 17 резолверов и 17 архивов.Поэтому файлы переехали в собственные
xPDOFileVehicleсо своим режимом.Замер
Обновление тем же пакетом, прогретый кэш ФС, по три прогона:
Около 30%. В #783 я сперва написал «три четверти» — та оценка снята с холодного кэша и для прогретого завышена. На реальном сайте, где обновления редки, выигрыш будет между этими числами; замера на shared-хостинге у меня нет.
Довод про
max_execution_timeиз первой редакции тоже убран:modTransportPackage::install()сам выставляет его в 0, так что упираются скорее в таймаут FastCGI или прокси.Что не изменилось
xPDOFileVehicle::_uninstallFiles()сноситcomponents/minishop3, покаUNINSTALL_FILESне скажет иначе, — ровно как резолвер. Каталогcomponents/целиком не трогается,nameзадан явно.vendor/autoload.phpна диске. В манифесте позиции 222–223 против 224 у категории.Побочно стало надёжнее при деинсталляции:
xPDOTransport::uninstall()идёт по vehicle в обратном порядке, так что теперь резолверы категории отрабатывают, пока файлы ещё на месте. Раньше файловые резолверы стояли внутри категории и файлы исчезали раньше. Сейчас их uninstall-ветки файлы не используют, но запас есть.Правки после ревью
packageFiles()переписан: размен назван прямо, довод проmax_execution_timeубран;CHANGELOG.mdиdocs/changelog.txtпод[Unreleased];readLatestChangelogEntry()научился пропускать[Unreleased]— иначе этот заголовок уехал бы в метаданные пакета вместо версии ([Bug] Обновление до 1.11.0-beta1: Data too long for column 'metadata' в modx_transport_packages #296);BuildFileVehicleTestпочинен регэксп:[^\]]*останавливался на вложенномRELATED_OBJECT_ATTRIBUTES => [], а ключ пишется константой в верхнем регистре, так что проверка никогда не срабатывала. Проверено мутацией — теперь падает;BuildChangelogMetadataTestна пропуск[Unreleased]и лимит TEXT.Локально: PHPStan без ошибок, smoke 121 тест.
🤖 Generated with Claude Code