Я пытаюсь понять, как работает процесс обновления package.json. Например:
"dependencies": {
"express": "^4.16.4",
},
В этом случае у меня Express с минусовым флагом ^
только для обновления 4.X.X. Это ясно. Но как именно работает это обновление? Я имею в виду, если я удалю папки node_module
(и package-lock.json) через 1 неделю после первой установки (и будет выпущена новая экспресс-версия), какую версию я загружу? 4.16.4 или (например) 4.17.0? Я думаю, что 4.17.0, но package.json все еще остается с 4.16.4 (текстовое описание), и об обновлении сообщается в package-lock.json или что-то еще? Я никогда не видел изменения чисел в package.json.
Я очень смущен этим.
Иногда, когда я проверяю какой-то модуль из их папки, я вижу версию, отличную от package.json. Почему?
Символ вставки (^) изменится на последняя основная версия (первое число). ^4.16.4
будет соответствовать любому выпуску 4.x.x
, включая 4.17.x
, но не будет обновляться до версии 5.0.0.
выпуска Express
, поскольку это основной выпуск с критическими изменениями в библиотеке Express
.
Что касается вашего вопроса: «Если бы я удалил каталог node_modules
и файл package-lock.json
через неделю после первой установки Express
и сказал, что в этот период была выпущена новая версия Express
, какую версию Express
я бы скачал?
Это зависит от того, была ли самая новая версия выпуском главный, незначительный, или пластырь. Если самая новая версия была второстепенной или патч-релизом: меняется второе или третье число, то npm установит последнюю версию 4.x.x. Express
версия. В вашем конкретном примере сценария да, он установил бы Express
V4.17.0. Вы также правы в том, что package.json
по-прежнему будет указывать "express: "^4.16.4"
как необходимую зависимость для создания вашего проекта. Это связано с тем, что каретка работает, как объяснялось ранее: возьмите последнюю версию 4.x.x. версия Express
. Нет необходимости обновлять ваш список Express
в package.json
до последней версии, так как морковь позаботится об этом за вас. Если подумать, это действительно приятная функция, поскольку альтернативой будет вручную указывать выпуск каждой новой версии, даже если это всего лишь второстепенный выпуск или патч. И ни у кого нет на это времени... если только это не крупный релиз.
Кроме того, поскольку последний выпуск Express
не был основным выпуском, то есть первое число вашего Semver
, не изменилось, нет «критических изменений», поэтому обычно безопасно просто получить последнюю версию. Однако при этом вы можете указать точную версию любой зависимости, если хотите. Что касается файла package-lock.json
, то этот файл похож на "снимок" вашего текущие конфигурации и сборки зависимостей. Таким образом, этот файл будет обновляться по мере того, как вы будете вносить изменения, влияющие на сборку вашего проекта: т. е. либо добавление новых зависимостей, либо обновление существующих версий. Это потому, что этот файл должен быть "источник истины" для других на случай, если они захотят воспроизвести создание вашего проекта и потенциально внести в него свой вклад.
Надеюсь, это поможет!
мой ответ имел смысл?