Эта страница переведена 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