Как написать кросс-платформенный пакет-оболочку 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 во время выполнения, если платформа не соответствует?

535   1  

1 ответ:

optionalDependencies вход - это путь, по которому нужно идти.

npm попытается установить необязательную зависимость по умолчанию, но не установив ее (например, из-за ограничений платформы модуля, но не только) не завершит весь процесс

Comments

    Ничего не найдено.