Как написать кросс-платформенный пакет-оболочку npm и обойти ошибку EBADPLATFORM при ненужной установке "условной зависимости"?
Предположим, я хотел создать кроссплатформенный пакет frobnicator.
Мне повезло, и я нашел несколько необходимых пакетов npm, но все они зависят от платформы
frobnicator-winfrobnicator-macfrobnicator-linux
Так что мне нужна только кросс-платформенная оболочка. Код может быть действительно довольно простым (при условии согласованности API):
var frobnicator;
if (process.platform == 'win32') {
frobnicator = require('frobnicator-win')
} else if (process.platform == 'darwin') {
frobnicator = require('frobnicator-mac')
} else { // let's assume this will work
frobnicator = require('frobnicator-linux')
}
// do the thing
Здесь возникает вопрос: каждый из малых модулей является добропорядочным гражданином и заявляет в соответствующей записи в своем package.json каковы их совместимые платформы, соответственно:
"os": ["win32"] / "os": ["darwin"] / "os": ["linux"]
Здесь есть две проблемы:
1) я зависим от модулей в зависимости от платформы (Мне никогда не нужны все из них, только один), но я должен поместить их все в мой
package.json (это не идеально, но мы можем жить с этим) 2) похоже на самом деле, что зависимость от модуля, чей
os не соответствует текущей ОС, невозможна, потому что npm install потерпит неудачу.Скажи, я хотел установите пакет mac на windows:
$ vim package.json
... // added all dependencies
$ npm install
...
npm ERR! notsup Unsupported
npm ERR! notsup Not compatible with your operating system or architecture: [email protected]
npm ERR! notsup Valid OS: darwin
npm ERR! notsup Valid Arch: any
npm ERR! notsup Actual OS: win32
npm ERR! notsup Actual Arch: ia32
Есть ли какой-либо выход из ситуации, кроме как просить владельцев субпакетов отменить требования os?
Что может быть лучшим обходным путем, чтобы действительно проверить платформу, не делая этого в package.json?
Создание исключения во время выполнения / вызов ошибки обратного вызова немедленно / process.exit(1) в сценарии CLI во время выполнения, если платформа не соответствует?
1 ответ:
optionalDependenciesвход - это путь, по которому нужно идти.
npmпопытается установить необязательную зависимость по умолчанию, но не установив ее (например, из-за ограничений платформы модуля, но не только) не завершит весь процесс
Comments