Как написать кросс-платформенный пакет-оболочку npm и обойти ошибку EBADPLATFORM при ненужной установке "условной зависимости"?
Предположим, я хотел создать кроссплатформенный пакет frobnicator
.
Мне повезло, и я нашел несколько необходимых пакетов npm, но все они зависят от платформы
frobnicator-win
frobnicator-mac
frobnicator-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