Установите разные пакеты в зависимости от версии узла - PullRequest
1 голос
/ 07 марта 2020

У меня есть проект, который зависит от пакета websocket . Однако для узла 10.x работает последняя версия (1.0.31) websocket, в то время как на узле 4.x работает версия 10.0.24, но для 10.0.31 не . Можно ли указать другой пакет (версии) для nodejs версии для обработки подобных случаев, например, так:

  • узел 4.x и старше -> websockets 1.0. 24
  • все другие версии узлов -> websockets 1.0.31

Предпочтительно, он должен работать как в npm, так и в пряже, но если он работает только в одном, это тоже хорошо.

Версия узла 10 используется в настройках разработчика, в то время как узел 4.x используется в устаревшей встроенной платформе, которая не может работать docker или обновляться.

1 Ответ

1 голос
/ 09 марта 2020

Рассмотрите возможность использования сценария postinstall в разделе scripts ваших проектов . json. Например:

пакет. json

"scripts": {
  "postinstall": "node install-websocket"
},

Как видите, сценарий postinstall вызывает сценарий nodejs с произвольным именем install-websocket.js.

install-websocket. js

const execSync = require('child_process').execSync;

const nodeMajorVersion = process.version.replace(/^v/, '').split('.')[0];
const websocketVersion = nodeMajorVersion <= '4' ? '1.0.24' : '1.0.31';

execSync('npm install websocket@' + websocketVersion, {
    cwd: __dirname,
    stdio: 'inherit'
});

Сценарий install-websocket.js по существу выполняет следующие задачи:

  1. Получает версию node.js, используя process.version, которая возвращает строку, например, v13.10.1

    Чтобы получить версию Major из этой строки ( т.е. 13 в вышеупомянутом примере) мы используем комбинацию методов replace () и split().

  2. The условный (троичный) оператор определяет, какую версию websocket установить впоследствии - исходя из того, равно ли значение nodeMajorVersion <= 4.

  3. Наконец, мы "shell out" соответствующая команда npm install websocket@x.x.x с использованием execSync.

    Примечание : если вас беспокоит execSync быть синхронным, затем использовать асинхронный exec вместо.


Дополнительные примечания:

  • С учетом кода, показанного выше предполагается, что файл install-websocket.js находится в root каталога вашего проекта, т.е. на том же уровне, что и пакет . json.

    my-project
    ├── package.json
    ├── install-websocket.js
    └── ...
    

    Это важно для * Файл 1086 * существует в этом месте по следующим двум причинам:

    1. В первую очередь, и самое главное, потому что вы заметили, что мы указываем __dirname для значение опции execSync cwd. Значение __dirname в этом контексте - это патам к родительскому каталогу, где находится файл install-websocket.js.

      По сути, установив параметр cwd для этого указанного c pathname (то есть путь к каталогу проекта), мы гарантируем, что при запуске команды npm install websocket@x.x.x она будет установлена ​​в том же месте, где находится ваш проект, независимо от того, установлен он локально или глобально.

    2. Сценарий postinstall в пакете . json ожидает, что файл install-websocket.js также будет находиться там. Обратите внимание, как это работает в настоящее время; node install-websocket, и не предполагает, что файл существует в другом месте, то есть он не выполняет что-то вроде: node ./some/path/to/install-websocket

  • Если потребители вашего пакета имеют npm настроен на ignore-scripts , тогда websocket просто не будет установлен, потому что сценарий postinstall не будет вызван.

...