Как отключить предупреждения при запуске узла через (глобальный) скрипт оболочки - PullRequest
2 голосов
/ 21 апреля 2019

Я создаю инструмент CLI с узлом и хочу использовать fs.promise API. Однако, когда приложение запускается, всегда есть ExperimentalWarning, что очень раздражает и портит подсказки взаимодействия. Как я могу отключить это предупреждение / все предупреждения?

Я тестирую это с последней версией узла v10 lts на Windows 10.

Чтобы использовать инструмент CLI глобально, я добавил это в мой package.json файл:

    { 
      //...
      "preferGlobal": true,
      "bin": { "myapp" : "./index.js" }
      //...
    }

И запустили npm link, чтобы связать скрипт ./index.js. Тогда я смогу запустить приложение в глобальном масштабе просто с помощью myapp.

После некоторых исследований я заметил, что обычно есть два способа отключить предупреждения:

  1. установить переменную среды NODE_NO_WARNINGS=1
  2. вызвать скрипт с node --no-warnings ./index.js

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

Шебанг, который я поместил в сценарий входа ./index.js:

#!/usr/bin/env node


// my code...

Я также читал другие дискуссии об изменении shebang, но не нашел универсального / кроссплатформенного способа сделать это - либо передать аргумент самому узлу, либо установить переменную env.

Если я опубликую этот пакет npm, было бы замечательно, если бы был способ убедиться, что предупреждения этого отдельного пакета заранее отключены, вместо того, чтобы каждый отдельный пользователь сам настраивал свою среду. Есть ли какие-нибудь скрытые конфиги npm package.json, которые позволяют это?

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 12 мая 2019

Я сейчас использую скрипт запуска, чтобы вызвать child_process, чтобы обойти это ограничение.Ужасно, но он работает с npm link, глобальными установками и еще чем-то.

#!/usr/bin/env node
const { spawnSync } = require("child_process");
const { resolve } = require("path");

// Say our original entrance script is `app.js`
const cmd = "node --no-warnings " + resolve(__dirname, "app.js");
spawnSync(cmd, { stdio: "inherit", shell: true });

Поскольку это похоже на хак, я не буду использовать этот метод в следующий раз, а вместо этого буду оборачивать оригиналAPI в обещании вручную, придерживаясь util.promisify или используя версию API блокировки / синхронизации.

...