Добро пожаловать в команду веб-разработчиков 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
, проблема осталась.
Затем я поискал и быстро нашел некоторые вопросы, связанные с этой проблемой:
- nodejs/node: дамп ядра узла 10.0.0 при установке модуля
- nodejs/node: Недавно выпущенная версия несовместима с Gulp ^3.9.0.
- gulpjs/gulp: Объединенное обновление грациозной-fs до Gulp 3
- gulpjs/gulp: сбой в узле 10
- isaacs/node-graceful-fs Ветка v3.x несовместима с мастером Node.js
- isaacs/node-graceful-fs v3.0.11 зависит от нативов 1.1.1, которые несовместимы с узлом 10.
пройти через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.natives
1.1.3 версия, но установленаnatives
1.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
, а затем переустановите его снова, что эквивалентно обновлению всех (прямых зависимостей + непрямых зависимостей) модулей.
Оригинальная ссылка:Посмотреть исходный текст