Ядро Discourse переходит на pnpm для управления JS-пакетами

Мы переходим с менеджера пакетов JS ядра Discourse с ‘yarn classic’ на pnpm. Это обеспечит значительное ускорение установки и сокращение требований к хранилищу.

Продакшн

Если вы используете управляемый хостинг или стандартную установку, вам ничего делать не нужно. Изменения будут применены автоматически при следующем обновлении.

Если у вас настроена собственная среда продакшн, вам необходимо заменить все команды yarn ... на pnpm ....

Разработка

После получения последней версии ядра Discourse при запуске сервера вы можете увидеть ошибку:

pnpm is not installed

Или, если вы выполните команду вроде yarn install, увидите:

error discourse@: The engine "yarn" is incompatible with this module. Expected version "please-use-pnpm". Got "..."

Чтобы решить эту проблему, выполните следующие шаги:

  1. выполните npm install -g pnpm

  2. выполните pnpm install

  3. замените все использования yarn ... в вашей среде разработки на pnpm ...

Плагины / Темы

Мы перешли на использование pnpm для зависимостей линтинга в наших официальных плагинах и темах.

Для discourse_theme CLI вам необходимо обновить локальную версию, выполнив gem update discourse_theme.

Возврат к yarn

Если вам нужно вернуться к версии Discourse на основе yarn (например, при разработке на стабильной ветке), вам необходимо вручную удалить все директории node_modules ядра:

rm -rf node_modules app/assets/javascripts/*/node_modules

Могу подтвердить безупречный плавный опыт работы в dev-версии: всё заработало с первого раза. Большое спасибо! :rocket:

Если вы используете собственную установку, нужно ли что-то делать, если не используются пользовательские компоненты и плагины?

Например, некоторые плагины и компоненты не являются официальными.

Если вы используете стандартную установку, вам не нужно ничего делать. Никаких изменений в плагинах или темах не требуется.

Не стоит ли нам изменить эту ожидаемую версию, например, на:

please-use-pnpm-see-https://meta.discourse.org/t/324521

:smiley:

Я участвую в другом проекте с открытым исходным кодом (FOSS), где совсем недавно впервые познакомился с PNPM. Переход оказался предельно простым, плавным, эффективным и настоящим удовольствием.

Я подготовил краткие заметки в документации того проекта о том, что такое PNPM и как им пользоваться. Хотя мелкие детали различаются в каждом проекте, надеюсь, что эта информация может послужить быстрым введением для любого из вас, кто, как и я, не имел ни малейшего представления до объявления.

Хороший ресурс, спасибо @TonyG

Стоит отметить, однако, что ни одно из «примечаний по конфигурации» там не требуется для Discourse. Не знаю, зачем им это нужно… может быть, потому что это приложение для Windows?

Также их примечание о том, что «в существующем проекте просто удалите папку ‘node_modules’», в Discourse обрабатывается автоматически этим скриптом :sunglasses:

Так что для нас это должно быть действительно так просто:

npm install -g pnpm
pnpm install

Один вопрос к тебе, Дэвид:

Как запускать линтинг локально?

То есть, что заменяет, например: yarn prettier --write plugins/discourse-events

Я попытался запустить

pnpm pprettier --write plugins/discourse-events

но получил ошибку:

Error: File not found with singular glob: /Users/blah/dev/disc/discourse/plugins/discourse-events (если это было намеренно, используйте опцию allowEmpty)

Кажется, у вас слишком много p?

Вам нужно:

pnpm prettier --write plugins/discourse-events

pprettier — это инструмент для параллельного запуска prettier, но, похоже, он не поддерживает запуск для отдельной директории в таком виде.

Спасибо за ваш вклад в документацию FOSS, @david :lol_: Действительно, страница, похоже, ориентирована на Windows, и информация там может быть необходима для работы с pnpm. Я отредактирую текст и проясню, что это не так для этой утилиты.

Для ясности: информация о том, как работает pnpm, добавлена только для удобства пользователя/разработчика, включая тех, кто здесь и кто, возможно, захочет понять этот новый инструмент, заменяющий важный и часто используемый инструмент в нашем наборе.

Для разработчиков Discourse эта информация объясняет, где находятся файлы и как изменить пути по умолчанию. Это призвано ответить на вопрос вроде: «Если все мои node_modules теперь в одном месте, где они?» В контейнере Discourse вы, разработчики, можете не хотеть размещать пакеты в расположении по умолчанию. Если по какой-то причине разработчик плагина напрямую обращается к папке node_modules и находит ссылки на другое место, а не на файлы, информация на этой странице кратко объясняет, как определяется это расположение.

Вот так я попытался быть кратким. :facepalm: :lolsob:

В любом случае, отличный переход на pnpm, спасибо.

Да, pprettier не подходил, спасибо.

Также решил мою главную проблему.

Оказывается, перед запуском проверок линтинга (даже из директории Discourse) необходимо выполнить pnpm install в директории плагина.

Хм, интересно :thinking:

В нашем стандартном скелете плагина у каждого плагина есть свой файл package.json с зависимостями для линтинга. И пока что скелет всё ещё использует yarn.

Так что для линтинга конкретного плагина нужно перейти в директорию плагина и выполнить:

yarn install
yarn prettier --write

Использование конфигурации линтинга из ядра для плагинов иногда работает. Но если версии или конфигурация расходятся, это может стать проблематичным, так как версия eslint/prettier в ядре не будет совпадать с версией, используемой в CI вашего плагина.

Стоит ли также рассматривать использование pnpm из директории плагина?

Насколько я понимаю, он всё ещё использует локальный package.json, верно?

Да, конечно! Мы просто дадим пыли осесть после изменений в ядре, прежде чем приступим к этому приключению.

(интересный факт: команда CDCK поддерживает почти 600 репозиториев тем и плагинов, которые все потребуют обновления :sweat_smile:)

Конечно, без проблем!

Кажется, всё сработало правильно, но меня сбило с толку уведомление, в котором, похоже, говорится, что это нужно делать вручную и что для сайтов со стандартной установкой это не автоматически:

Спасибо @Architect. Эти PR-ы подавят сообщения об обновлении:

Возникла проблема при обновлении через веб-инструмент — страница обновления сообщала об ошибке обновления с ошибкой `Expected version

Спасибо за сообщение, @alxndr.

Я только что отправил это исправление, которое должно предотвратить повторение этой проблемы у других пользователей.

Возможно, это связано с нашей средой Communiteq, но, честно говоря, я не вижу никаких значительных улучшений скорости во время установки? Наш стабильный тестовый установочный процесс даже на 23 секунды быстрее, чем тестовый с меткой «тесты пройдены».