Как развлечься с NPM package-lock.json

Node.js внешний интерфейс NPM Gulp

Добро пожаловать в команду веб-разработчиков Futu, php, front-end нуждается в вас.несоответствие

Футу растет день ото дня, а друзей становится все больше. Итерация обновления интерфейса всегда происходит. В качестве основного фреймворка для фронтенда использовался Vue.Думая о том, что было 2 года назад, я все еще писалJQ, напишите послеangular.js. Фронтенд-упаковка также отправляется из оригинального упаковочного файла в библиотеку Gitlab, а затем подключается к jenkins (файл упаковки не хранится в библиотеке), а затем — к сегодняшнему Gitlab CI.

Осмельтесь попробовать и подтолкнуть к реализации.

Сегодня я поделюсь с вами подводными камнями, с которыми приходится сталкиваться при сборке внешнего интерфейса и доступе к Gitlab CI.

Также поставляется с компонентом для загрузки пакетов Gitlab CI:Просмотр компонентов

задний план

Да, я объясню предысторию, когда буду писать статью недавно. Из-за рутинного названия это должна быть учебная статья, но на самом деле такая статья довольно скучна. Причина, по которой я хотел написать это, заключается в том, что я столкнулся с некоторыми очень неприятными вещами. Без лишних слов, давайте к делу.

В последнее время упаковка нашего внешнего кода интегрируется в Gitlab CI с использованием Docker в качестве исполнителя, то есть упаковка внешнего кода в Docker, а затем сбор результатов упаковки для использования при публикации. При упаковке образ Docker, естественно, выбрал официальный образ Node, последнюю версию (Node 10).

Вначале мы попробовали несколько проектов, некоторые из которых были упакованы с помощью сценариев NPM, а некоторые — с помощью Gulp, и все работало нормально. Но вчера, когда я подключил новый проект и запаковал его с помощью Gulp, я вдруг столкнулся с ошибкой:

$ gulp gitlab-ci
gulp[85]: ../src/node_contextify.cc:631:static void node::contextify::ContextifyScript::New(const v8::FunctionCallbackInfo<v8::Value>&): Assertion `args[1]->IsString()' failed.
Aborted
ERROR: Job failed: exit code 134

Взглянув на это сообщение об ошибке, я сразу обнаружил, что это ошибка не JS-слоя, а нативного Node-слоя, что выше моего понимания.

Проблемы совместимости версии модуля

Путем поиска мы впервые нашли китайское решение:Решение ошибки gulp после обновления node10. В статье приведены следующие решения:

rm -fr node_modules
rm -fr package-lock.json
npm cache clean --force
npm install

Итак, каков принцип? Объяснений в статье я не увидел, да и сама статья была не очень понятной. Со скептическим настроем добавил его в CI скриптnpm cache clean --force, проблема осталась.

Затем я поискал и быстро нашел некоторые вопросы, связанные с этой проблемой:

пройти черезnpm ls, ты сразу увидишьnativesВерсия модуля 1.1.1, поэтому настоящая проблема находится:gulpполагатьсяvinyl-fs,vinyl-fsполагатьсяgraceful-fs,graceful-fsполагатьсяnatives,а такжеnativesНе совместим с Node 10 до версии 1.1.3.

Тогда решение простое, просто придумать способ обновить модуль?

Как обновить косвенные зависимости

Первое, что приходит на ум, есть ли у Gulp решение этой проблемы,npm info gulpЯ посмотрел и обнаружил, что последняя версия3.9.1,Потомnpm lsСмотри, обнаружил, что машина уже установлена3.9.1То есть у Gulp вообще нет возможности обновиться. Как обновить эту косвенную зависимость?

Здесь я делаю обход,package.jsonМодули, которые напрямую зависят от, не могут быть обновлены.npm updateТоже не могу получить. Вот я и подумал, если явно установить этот модуль, это решит проблему?

npm install natives@1.1.3

После завершения установкиpackage.jsonЛейтенант будет напрямую зависеть отnativesУдалил (поскольку напрямую от него не завишу, оставлять бесполезно). Затем снова проверьте зависимости:

▶ npm ls natives
seed@1.0.0 /Users/TooBug/work/oa/learn/frontend
└─┬ gulp@3.9.1
  └─┬ vinyl-fs@0.3.14
    └─┬ graceful-fs@3.0.11
      └── natives@1.1.3

Прямо на этот раз.

Однако я проделал эту операцию на локальной машине, что изменилось в этой операции? Если вы пойдете в CI и выполните его сноваnpm install, он все равно будет установлен на старую версию? после всегоpackage.jsonНичего не изменилось.

Так что я посмотрелgit diff, нашел главного героя этой статьиpackage-lock.jsonбыл изменен, в которомnativesИзменено с 1.1.1 на 1.1.3.

"natives": {
    "version": "1.1.3",
    "resolved": "http://registry.npm.oa.com/natives/download/natives-1.1.3.tgz",
    "integrity": "sha1-RKV5vmRQfqLW7RygSpQVkVz3VVg="
},

Так я вдруг понял: Изначально, когда npm устанавливал модули, он устанавливал последнюю версию по семантической версии, но не устанавливался на CI.natives1.1.3 версия, но установленаnatives1.1.1 именно потому, чтоpackage-lock.jsonУстановленная версия заблокирована, что вызывает проблему несовместимости с Node 10.

Это также очень хорошо объясняет, почему в других проектах нет этой проблемы, потому что другие проекты не включены в репозиторий кода.package-lock.json, устанавливается естественно в момент установкиnativesВерсия 1.1.3.

Итак, вернемся к решению, предложенному статьей, которую я нашел в начале:

rm -fr node_modules
rm -fr package-lock.json
npm cache clean --force
npm install

на самом деле очень эффективен, потому что онpackage-lock.jsonУдалите его напрямую, а затем переустановите последнюю версию, чтобы создать новую.package-lock.json, тем самым решая проблему.

Расширение: как правильно использовать его в своем проектеpackage-lock.json

Наконец, также добавьтеpackage-lock.jsonправильное использование. (Хотя я знаю, я все же случайно наступил на яму. Если я не буду знать, как ею пользоваться, я могу долго оставаться в яме и не смогу выбраться.)

Во-первых, необходимо убедиться, чтоnpmВерсия выше 5.6, потому что в середине 5.0 - 5.6, правильноpackage-lock.jsonЛогика обработки обновлена ​​в нескольких версиях. 5.6 и выше соответствует логике познания.

Тогда, если нет необходимости блокировать версию в проекте, можно не использоватьpackage-lock.json, указанный при установке модуля--no-lockВот и все.

Если проект имеетpackage-lock.json, модуль будет загружен и установлен напрямую на основе версии и адреса, указанных в этом файле при установке модуля. (если только это иpackage.jsonВерсии, указанные в не совпадают. )

Наконец, если версия заблокирована и необходимо обновить прямые зависимости, установите указанную версию напрямую.package.jsonа такжеpackage-lock.jsonбудет обновляться синхронно. Если вам нужно обновить косвенные зависимости, вам нужно установить его вручную, как в этой статье, чтобы убедиться, чтоpackage-lock.jsonбыл обновлен до. Или, если блокировка других модулей не так важна, ее также можно удалить напрямую.package-lock.json, а затем переустановите его снова, что эквивалентно обновлению всех (прямых зависимостей + непрямых зависимостей) модулей.

Оригинальная ссылка:Посмотреть исходный текст