import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/ru/scripts/bin/dxt-build-publish-packages - Публикация пакетов'/>

# dxt-build-publish-packages

Команда `dxt-build-publish-packages` обеспечивает автоматическую публикацию npm-пакетов в рабочем пространстве. Инструмент использует `BuildPublishPackages` и `PackageFile` для сканирования активных директорий библиотек, отслеживания версий и публикации пакетов при обнаружении новой версии.

## Ключевые возможности

- **Автоматическое сканирование монорепозитория**: Обнаруживает активные директории пакетов внутри папки `/packages/`, содержащие корректный файл `package.json`.
- **Инкрементальное кэширование на основе версий**: Избегает избыточных публикаций благодаря ведению локального кэша публикаций в файле `./logs/ui-publish.log.json`. Публикация пакета запускается только в том случае, если его текущая версия в `package.json` изменилась по сравнению с сохраненной в кэше.
- **Интеллектуальный выбор скриптов**: Автоматически выполняет скрипт `"publish-to-npm"`, если он определен в скриптах пакета, с переходом на стандартную команду `npm publish --access public`, если первый отсутствует.
- **Исключение из публикации**: Автоматически пропускает пакеты, помеченные как приватные (`"private": true` в `package.json`) или содержащие свойство `"ui-no-publish": true`.

## Как это работает?

Процесс публикации пакетов автоматизирует проверки и вызовы команд публикации:

1. **Сканирование директорий**: Класс `BuildPublishPackages` сканирует целевую директорию пакетов (по умолчанию `/packages/`) и считывает файл кэша публикаций `./logs/ui-publish.log.json`.
2. **Фильтрация и валидация**: Для каждой папки создается обертка `PackageFile` для проверки того, что она является пакетом и не исключена из публикации.
3. **Выполнение публикации**: Если версия пакета не зарегистрирована или отличается от кэшированной версии:
   - Если существует скрипт `"publish-to-npm"`, выполняется `npm run publish-to-npm`.
   - В противном случае выполняется команда `npm publish --access public`.
4. **Синхронизация логов**: После успешной публикации пакета его версия обновляется в кэше в оперативной памяти.
5. **Сохранение логов**: Если один или несколько пакетов были успешно опубликованы, обновленный кэш сохраняется обратно в `./logs/ui-publish.log.json`.

## Дополнительная информация

### Файл кэширования логов (`ui-publish.log.json`)

Локальный кэш хранится по пути:
```
./logs/ui-publish.log.json
```
Если вы хотите принудительно переопубликовать все пакеты независимо от их версий, вы можете удалить этот файл или сбросить его содержимое до пустых скобок `{}`.

### Исключение из публикации

Если вы хотите, чтобы публикатор игнорировал конкретный пакет, добавьте одно из следующих свойств в его файл `package.json`:
```json
{
  "private": true
}
```
или:
```json
{
  "ui-no-publish": true
}
```
