CKEditor используется в проекте, и доработка некоторых фич потребовала изменения пары родных пэкэджей. Например, @ckeditor/ckeditor5-paragraph
Сделали локальную копию всего пакета в коде нашего проекта в src/overrides/ckeditor5-paragraph и добавили свой код в нужные компоненты. По-человечески иначе требуемый функционал не добавить.
Как правильно подсунуть теперь этот монстр Франкенштейна в сборку CKEditor5?
Простой способ на поверхности — через npm link заменить в node_modules родной модуль на наш модифицированный. Он просто создает hard link, и вместо папки node_modules/@ckeditor/ckeditor5-paragraph становится линк на наш src/overrides/ckeditor5-paragraph Плюс еще в 14 местах надо проделать то же самое — каждый из packages CKEditor'а в собственных node_modules имеет копию ckeditor5-paragraph
Плюс шелл скрипт, который сделает npm install, потом серию npm link'ов и затем npm run build.
При обновлении версий, этот карточный домик рухнет, т.к. npm link перестанет цеплять устаревшую версию локального пакета. Наверное. Ну и ладно, при обновлении надо будет перепроверить все наши топорные overrides. Такова расплата.
Никогда не сталкивался с такой задачей варварской модификации родных модулей используемого пакета.
Как это правильно делать?
Про родной npm не скажу, сто лет не попользовался, не знаю какие там фичи добавили, а в yarn(и pnpm) есть поле resolutions в package.json, там можно это прописать. (там можно не только версию указать, но полноценно на зависимость, например:
В package.json есть раздел overrides как раз для таких модификаций зависимостей зависимостей. В примерах в документации там почему-то акцент сделан только на версии пакетов, но можно и полностью заменить пакет на свой, если указать не версию, а локальный путь к нему.
Сергей Соколов
@sergiks Автор вопроса, куратор тега JavaScript
Странно, что если npm install делался без override, и уже потом в package.json добавилась override секция с локальным путем, то npm run build (webpack --mode production) срабатывал нормально.
Но если все с нуля — удалить корневые node_modules и package-lock.json, в package.json уже внесена секция override, и сделать npm install — то во-первых в package-lock оказываются странные пути типа
– вместо всегда одного локального пути — каждый раз относительный от корня очередного модуля, у которого этот Paragraph в зависимостях;
и во-вторых не билдится, т.к. не находится этот модуль @ckeditor/ckeditor5-paragraph/dist/index.js
Сергей Соколов, Т.е. получается, что overrides работает, но пути определяются не от корня проекта, а от корней зависимостей в node_modules? Если попробовать в пути в overrides добавить "../../../", то что-то меняется?
Написано
Сергей Соколов
@sergiks Автор вопроса, куратор тега JavaScript
Сергей Соколов, Это очень странно, что в resolved ничего не меняется. Попробовал сделать тестовый проект с ckeditor5 в зависиостях, в package.json добавил
А в node_modules вместо модуля @ckeditor/ckeditor5-clipboard создалась ссылка на директорию с исходниками (которая src/overrides/......). Версия nodejs - v20.11.1, npm - 10.2.4. Для paragraph тоже все работает, ссылки создаются, в том числе и во вложенных node_modules.
Написано
Сергей Соколов
@sergiks Автор вопроса, куратор тега JavaScript
Сергей Соколов
@sergiks Автор вопроса, куратор тега JavaScript
Ivan Bogachev, ссылки создаются? Это странно – на какой платформе? Вроде, линки делает только npm link, а overrides влияет, как я понял, только на ресолвинг.
Написано
Сергей Соколов
@sergiks Автор вопроса, куратор тега JavaScript
Попробую создать минимальный изолированный пример, демонстрирующий проблему
Сергей Соколов, Платформа - linux. Ссылки появляются после npm i. Мне на самом деле казалось, что install всегда так работал с локальными зависимостями, которые лежат непонятно где.
Сергей Соколов, Проверил npm list, он действительно ругается, но на функциональность это не влияет. Ссылки создаются корректные.
Написано
Сергей Соколов
@sergiks Автор вопроса, куратор тега JavaScript
Ivan Bogachev, действительно, линки создаются! find ./node_modules -type l -print выводит список, и там корректные ссылки на локальные оверрайды, похоже.
Чего не хватает — так это ссылок на оверрайды из корневого, не саб-модульного /node_modules/@ckeditor/ — ckeditor5-paragraph, например, там отстутсвует и как папка и как ссылка. Оказывается, в этом проблема: "overrides" занимается только под-зависимостями, но не самими dependencies.
Поэтому пришлось ещё дополнительно
npm link --save ./src/plugins/core-overrides/ckeditor5-paragraph
и для других двух то же. Это создало ссылки в корневом node_modules и прописало в dependencies то же, что в overrides. Причем npm сам прописал пути как file:src/plugins/... без ../../../
CKEditor это монорепо, со всеми этими packages/ckeditor5-paragraph и пр. как workspace'ами. Т.е. они не считаются за под-зависимости.