Перейти к основному содержимому
Неофициальный Бета-перевод

Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →

Настройка публикуемых файлов

При публикации пакета в реестр по умолчанию публикуется всё содержимое исходной директории пакета. Это не всегда оптимально, поскольку часто существуют файлы, актуальные только для разработки (например, тесты и конфигурационные файлы), или может потребоваться предварительная компиляция исходных файлов с выводом результатов в централизованное расположение в монопоточном репозитории.

Lerna предоставляет несколько вариантов конфигурации, чтобы гарантировать публикацию только необходимых файлов в реестр.

Свойство "files" и .gitignore

Lerna всегда использует инструментарий npm для публикации, который предлагает встроенные способы включения и исключения файлов. Самый простой способ настроить публикуемые файлы — через свойство "files" в package.json и файл .gitignore. Подробнее о том, как npm определяет файлы для публикации, читайте в документации npm.

--contents [устаревший → предпочтительнее --directory]

Некоторые команды, включая lerna publish, поддерживают общую опцию --contents, которая задаёт директорию публикации для ВСЕХ пакетов.

Это полезно только при публикации, если пакеты в вашем монопоточном репозитории имеют простую, однородную структуру вывода. Аргумент, передаваемый в --contents, должен быть поддиректорией, существующей внутри каждого публикуемого пакета. Подробности см. в документации lerna publish.

В версии 7 мы представили более мощную и целенаправленную опцию --directory для lerna publish. Рекомендуем использовать её вместо --contents, так как последняя, вероятно, будет устаревшей в будущем.

--directory

В версии 7 мы представили более мощную и целенаправленную опцию --directory для lerna publish.

Её можно настроить в lerna.json с использованием следующих динамических плейсхолдеров: {workspaceRoot}, {projectRoot}, {projectName}. Эти значения будут динамически заменяться во время публикации.

Это позволяет кратко описывать конфигурации с единым стилем, но не обязательно идентичные для всех пакетов.

Например, рассмотрим монопоточный репозиторий, где все пакеты собираются с выводом результатов в централизованное расположение (как это принято в рабочих пространствах Nx):

У нас есть packages/package-a, который записывает результаты сборки в dist/packages/package-a, и packages/package-b, который использует dist/packages/package-b.

Хотя пути строго различаются, мы можем выразить единый подход через плейсхолдеры:

{workspaceRoot}/dist/{projectRoot}

{workspaceRoot} будет заменён абсолютным путём к репозиторию Lerna, а {projectRoot} — на packages/package-a для package-a и packages/package-b для package-b.

Применяем это в lerna.json следующим образом:

// lerna.json
{
"version": "1.0.0",
"command": {
"publish": {
"directory": "{workspaceRoot}/dist/{projectRoot}"
}
}
}

Вы также можете задать или переопределить параметр директории публикации в package.json отдельного пакета, если требуется полностью кастомная конфигурация.

Пример конфигурации для пакета, публикующегося из папки dist/packages/foo в корне репозитория:

// packages/foo/package.json
{
"name": "foo",
"version": "1.0.0",
"lerna": {
"command": {
"publish": {
"directory": "../../dist/packages/foo"
}
}
}
}
информация

Убедитесь, что в вашей пользовательской директории находится валидный package.json, который будет использоваться для публикации в реестре. Вы можете создать его через lifecycle-скрипты типа prepare, prepublishOnly или prepack при необходимости сложной кастомной логики. Альтернативно — настроить автоматическое копирование из исходников пакета как ассета. Подробности в разделе Включение дополнительных ресурсов в публикуемые пакеты.

Чтобы конкретный пакет публиковался из исходников (стандартное поведение Lerna), переопределите его конфиг публикации:

// packages/foo/package.json
{
"name": "foo",
"version": "1.0.0",
"lerna": {
"command": {
"publish": {
"directory": "."
}
}
}
}

Включение дополнительных ресурсов в публикуемые пакеты

Lerna может копировать файлы из исходной директории в указанную для публикации. Как и с опцией directory, это настраивается в lerna.json (включая динамические плейсхолдеры) или в package.json конкретного пакета.

Вне зависимости от файла конфигурации, свойство "assets" должно содержать массив glob-паттернов или объектов со свойствами "from" и "to". "from" указывает файл/паттерн в исходной директории, "to" — путь назначения внутри публикуемой директории.

Этот пример пакета компилирует вывод в корневую директорию dist/packages/bar. Lerna настроена копировать дополнительные файлы в эту директорию, затем публиковать содержимое dist/packages/bar в npm.

// packages/bar/package.json
{
"name": "bar",
"version": "1.0.0",
"lerna": {
"command": {
"publish": {
"directory": "../../dist/packages/bar",
"assets": [
"README.md",
"package.json",
"docs/*.md",
{
"from": "static/images/*",
"to": "assets"
},
{
"from": "../../CONTRIBUTING.md",
"to": "./"
}
]
}
}
}
}

Lerna обработает конфигурацию выше и скопирует файлы в dist-директорию, создав структуру:

dist/packages/bar
├── assets
│ ├── my-image-1.png
│ └── my-image-2.png
├── CONTRIBUTING.md
├── docs
│ ├── my-doc-1.md
│ └── my-doc-2.md
├── package.json
└── README.md