Lockfile, версии и целостность архива
Диапазон версии в package.json задаёт допустимые варианты, а lockfile описывает выбранное дерево. Для воспроизводимого обсуждения обновления нужны оба документа. В этом уроке сопоставим пожелание, конкретную версию, источник архива и сведения о целостности.
«Контур выпуска» использует lock-tree-v1.json как авторскую модель. Это не настоящий package-lock.json и не результат npm install. Реальных контрольных сумм реестра в нём нет; fictional:true и integrity:null сохраняют эту границу.
Диапазон и выбранное состояние
В fixture манифест допускает lab-render по диапазону ^1.4.0, а модель дерева выбирает 1.4.2. Диапазон объясняет намерение проекта; выбранная версия — предмет текущего ревью. Если в новой модели появилась 1.5.0, одно неизменное пожелание package.json не означает неизменность кода. Поэтому обновление следует рассматривать по разнице дерева.
Транзитивный lab-parser пришёл через lab-render. Он тоже получает конкретную версию и ребро происхождения. Если обновление родителя приводит к новому parser, это часть того же изменения. Нельзя ограничивать решение единственной верхней строкой. Для нашей маленькой модели достаточно нескольких узлов; реальный lockfile может хранить сложное размещение и несколько версий одного пакета.
В настоящем lockfile resolved описывает источник выбранного пакета, а integrity позволяет проверять соответствие полученных байтов ожидаемому значению. Это не оценка добросовестности кода. Архив может корректно совпасть с собственной контрольной суммой и всё равно содержать нежелательное действие. Целостность и содержательное доверие отвечают на разные вопросы.
В лаборатории resolved указывает на зарезервированный registry.example, а integrity остаётся null. Нельзя заменить его произвольной строкой sha512 и представить её реальной подписью. Наше состояние специально не пригодно для сетевой установки. Для арифметического объяснения отпечатка можно использовать собственные локальные файлы, но их хеш не станет integrity пакета реестра.
Рассмотрим npm ci как будущую операцию читателя в настоящем проекте. Документация связывает её с существующим lockfile и согласованностью манифеста; несовпадение вызывает ошибку вместо молчаливого обновления. При этом конкретные опции формирования дерева нужно сохранять согласованными. Команда не обещает воспроизводимость всей среды, если версия Node, платформа и разрешённые скрипты изменились.
Что сравнивать в обновлении
В lock-diff.csv модель v2 отличается версией родителя, транзитивным узлом и признаком install-скрипта. Каждая разница получает причину и статус разбора. Решение «версия стала новее» не объясняет, почему пакет нужен или какие права он получит. Отдельная строка о новом скрипте ведёт к следующему уроку политики выполнения.
Сохраним среду рядом с деревом: документация npm 12.2.0, фактическая версия Node неизвестна, исполнение не проводилось. Для собственного запуска читатель должен выбрать совместимую среду по актуальным требованиям и записать её точно. Нельзя подставлять версию локального Python как доказательство выполнения npm, потому что в этой подготовке Python лишь записывает авторские файлы.
Если source меняется с реестра на Git или локальную папку, это самостоятельное изменение доверия. Совпадение package name не гарантирует одинаковую идентичность источника. В реестре решений храним resolved и тип происхождения отдельно. Для install-скриптов npm сопоставляет разрешение с разрешённой идентичностью, а не только самоназванием внутри пакета.
Результат — объяснённая разница двух моделей дерева и список сведений, которые потребуются настоящей установке. Наличие lockfile помогает зафиксировать выбор, но не делает разрешения и окружение безопасными автоматически. В следующем уроке сузим право выполнения lifecycle-скриптов до конкретного рассмотренного пакета и версии.
При передаче модели другому человеку обязательно сохраняйте название файла и описание статуса. Если переименовать fixture в package-lock.json, появится ложное ожидание, что npm может воспроизвести установку. Наш документ остаётся учебной моделью и не участвует в запуске маленького проекта. У фактически исполняемого примера внешних зависимостей нет.
Попробуйте добавить в модель ещё одну версию parser для другого родителя. Теперь имя пакета перестаёт быть достаточным ключом узла. Требуются версия и контекст разрешения. Такой вариант показывает, почему ревью большого дерева не сводится к таблице уникальных имён: разные участки могут использовать разные экземпляры с разными последствиями обновления.
Разница двух сохранённых деревьев
Сначала откройте модель v1, затем v2 и lock-diff. Для каждого изменения найдите конкретный узел. Диапазон lab-render остаётся прежним, но выбранное состояние может измениться. Поэтому карточка не должна говорить «package.json тот же, значит, обновления нет». Совпадение одного входа не подтверждает совпадение всей операции разрешения.
| Предмет | Как сохраняется основание |
|---|---|
| Манифест | Диапазон записан как намерение проекта, которое не заменяет точный предмет выбранного кодового состояния. |
| Модель дерева | Содержит вымышленные версии и связи для анализа, но не пригодна как вход настоящей npm-установки. |
| Источник | Адрес .example показывает учебное происхождение и не является проверенным архивом какого-либо пакета реестра. |
| Integrity | Пустое значение честно отражает отсутствие полученных байтов и не заменяется правдоподобной случайной подписью. |
При изменении версии отметьте, появился ли новый lifecycle-скрипт. Это отдельная разница, даже если API обработки данных совпадает. Для нашего учебного обновления именно она ведёт к политике разрешений. Хороший diff помогает увидеть разные последствия одной операции вместо универсального статуса update_ok.
Реальная воспроизводимость потребует также версии инструмента, платформы и параметров установки. Если одна среда пропускает optional-компонент, а другая устанавливает его, физические деревья могут различаться. Сохранённый lockfile остаётся важным входом, но не единственным. В лаборатории эти условия обозначены как будущие сведения читателя.
Для дополнительного варианта добавьте источник Git вместо реестра. Теперь следует обсудить, как фиксируется ревизия, какой код может исполняться при подготовке и какие разрешения сопоставляются с идентичностью. Не используйте вымышленный commit SHA как доказательство фактического получения. Достаточно показать места договора и оставить неполученные значения неизвестными. Это сохраняет материал честным и пригодным для последующего реального выполнения.
Обратите внимание на место хранения: реальный lockfile находится рядом с собственным манифестом, а учебная модель хранится отдельно. Такое разделение предотвращает случайный запуск фиктивного дерева и сохраняет назначение файлов понятным без устного предупреждения автора.
Полный основной артефакт lock-diff.csv выбранного состояния:
package,before,after,changed_property,decision_state,fixture
lab-render,1.4.2,1.5.0,version,review_pending,fictional
lab-parser,0.8.0,0.9.0,transitive_version,review_pending,fictional
lab-native,1.2.3,1.3.0,new_install_script_detail,review_pending,fictional
Все исходники серии: папка lesson-02 содержит полный самостоятельный снимок, собственный проект и авторские модели. Исполнение примеров, npm, установки, аудит, тесты, CI, настройки и публикация не выполнялись.