Указывая основное поле в package.json условно - PullRequest
0 голосов
/ 06 марта 2019

У меня есть Monorepo под рабочими пространствами Lerna и Yarn. В репо есть пакеты, которые публикуются в npm и потребляются как за пределами monorepo, так и внутри monorepo. При разработке в monorepo мы хотели бы, чтобы поле main package.json для всех таких пакетов указывало на каталог src, тогда как когда пакет используется вне monorepo, мы бы хотели, чтобы потребитель использовал переданный код в папке dist.

Я хочу, чтобы это было единообразно для всех видов использования пакетов. Мое текущее решение состоит в том, чтобы поле main указывало на папку dist. Затем для каждого из инструментов в рамках monorepo, а именно jest, tsc, webpack, parcel мне пришлось придумать другое решение для конкретного инструмента для наложения псевдонима каталога src вместо dist справочник. Но мне не нравится тот факт, что мне пришлось выполнять эту работу для каждого из этих инструментов. Это просто не кажется масштабируемым.

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

Спасибо.

1 Ответ

0 голосов
/ 13 марта 2019

Если ваша внутренняя кодовая база всегда переносит источники, почему бы не просто import { thing } from "my-package/src/main.js?

Тогда вы можете просто оставить основное поле как dist для потребителей, которые в идеале не должны отслеживать дополнительные пути при импорте ваших пакетов.

В вашем ответе осталось много деталей, но предполагается, что вы используете один веб-пакет / другой экземпляр для компиляции всех ваших пакетов.

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

И, наконец, третий подход, который, как мне кажется, звучит немного запутанно, но должен делать именно то, что вы просите. Создайте сценарий, который использует globby или какой-либо другой пакет npm для захвата всех файлов package.json в вашем хранилище (кроме node_modules!). require () / переберите эти файлы манифеста package.json и установите для основного поля входное значение (скажем, "dist"). Затем создайте два файла bin js (подсказка: поле bin) с именами set-main-dist и set-main-src и, возможно, третий с именем unset-main.

Далее, независимо от того, какие скрипты вы запускаете в файлах package.json в корневом каталоге (или с помощью lerna run), убедитесь, что скрипт выглядит так:

"prebuild": "set-main-src"

или как это

"build": "set-main-src && build etc"

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

...