Найти тему

Как работают npm install, npm ci, причем здесь semver?

Оглавление

npm install и npm ci — это команды для управления зависимостями в проекте Node.js, и их работа тесно связана с системой версионирования, известной как SemVer (Semantic Versioning). Давайте рассмотрим, как они работают и какое значение имеет SemVer в этом контексте.

Семантическое Версионирование (SemVer)

SemVer — это система версионирования, в которой номер версии разделяется на три части: MAJOR.MINOR.PATCH.

  • MAJOR: Вносит изменения, которые могут быть несовместимы с предыдущими версиями.
  • MINOR: Добавляет новые функции, но сохраняет совместимость с предыдущими версиями.
  • PATCH: Вносит исправления ошибок и не ломает совместимость.

Например, версия 2.3.1 означает 2 — MAJOR, 3 — MINOR, 1 — PATCH.

Как работают npm install и npm ci

1. npm install

  • Установка зависимостей:Если в проекте есть файл package-lock.json, npm install использует его для установки зависимостей. В противном случае он устанавливает зависимости на основе версий, указанных в package.json.
  • Если зависимость в package.json указана в виде ^1.2.3, npm install будет искать последнюю доступную MINOR или PATCH версию, совместимую с 1.x.x, например, 1.4.5.
  • Обновление package-lock.json:Если установлена новая зависимость или обновлена существующая, npm install обновит package-lock.json в соответствии с установленными версиями.
  • Работа с SemVer:npm install учитывает SemVer-диапазоны, указанные в package.json. Например, если указана версия ^2.3.0, npm может установить любую совместимую версию 2.x.x, которая соответствует package-lock.json или последнюю доступную совместимую версию.

2. npm ci

  • Установка зависимостей:npm ci работает исключительно с package-lock.json. Он удаляет папку node_modules и заново устанавливает зависимости, указанные в package-lock.json, без учета package.json.
  • Преимущества npm ci:Быстрая и детерминированная установка зависимостей.
  • Используется в CI/CD процессах, где важна предсказуемость.
  • Не изменяет package-lock.json, гарантируя, что зависимости будут установлены точно так, как они зафиксированы.
  • Работа с SemVer:Поскольку npm ci строго следует package-lock.json, он не будет устанавливать новые версии, даже если в package.json указан более широкий диапазон SemVer. Все установки будут соответствовать зафиксированным версиям в package-lock.json.

Связь с SemVer

  • SemVer в package.json: Определяет диапазон версий зависимостей, которые могут быть установлены (^, ~, >=, и т.д.).
  • SemVer в package-lock.json: Фиксирует точные версии зависимостей, которые были установлены, чтобы обеспечить повторяемость установки.

Итог:

  • npm install: Использует SemVer-диапазоны для поиска и установки подходящих версий зависимостей. Обновляет package-lock.json при необходимости.
  • npm ci: Игнорирует SemVer-диапазоны, строго следует package-lock.json и обеспечивает детерминированную установку, не внося изменений в package-lock.json.

Обе команды управляют зависимостями проекта, но npm ci предназначен для ситуаций, где важна точная установка, а npm install — для разработки, где возможно обновление зависимостей.