Как отключить предупреждения при запуске узла с помощью (глобального) сценария оболочки

#node.js #npm #fs

#node.js #npm #fs

Вопрос:

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

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

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

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

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

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

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

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

Ошибка, которую я поместил в сценарий входа ./index.js ,:

 #!/usr/bin/env node


// my code...
  

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

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

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

Ответ №1:

Сейчас я использую скрипт запуска для создания a 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 с блокировкой / синхронизацией.

Ответ №2:

Я настроил свой тестовый скрипт следующим образом:

  "scripts": {
    "test": "tsc amp;amp; cross-env NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 jest"
  },
  

Обратите внимание на эту NODE_NO_WARNINGS=1 часть. Он отключает предупреждения, которые я получал от настройки NODE_OPTIONS=--experimental-vm-modules

Ответ №3:

Вот что я использую для запуска узла с флагом командной строки:

 #!/bin/sh
_=0// "exec" "/usr/bin/env" "node" "--experimental-repl-await" "$0" "$@"

// Your normal Javascript here
  

Первая строка сообщает оболочке использовать /bin/sh для запуска сценария. Вторая строка немного волшебная. Для оболочки это присвоение переменной _=0// , за которым следует "exec" ... .

Узел видит это как присвоение переменной, за которым следует комментарий — так что это почти nop, кроме побочного эффекта присвоения 0 _ .

В результате, когда оболочка достигает строки 2, она запускает узел (через env) с любыми необходимыми параметрами командной строки.

Ответ №4:

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

 const originalEmit = process.emit;
process.emit = function (name, data, ...args) {
  if (
    name === `warning` amp;amp;
    typeof data === `object` amp;amp;
    data.name === `ExperimentalWarning` 
    //if you want to only stop certain messages, test for the message here:
    //amp;amp; data.message.includes(`Fetch API`)
  ) {
    return false;
  }
  return originalEmit.apply(process, arguments);
};
  

Вдохновленный этим патчем для yarn

Ответ №5:

Мне нужно было подавить:

Предупреждение об эксперименте: импорт модулей JSON является экспериментальной функцией и может измениться в любое время

И это сработало для меня в Windows, Node.js 18.х:

 #!/usr/bin/env node --no-warnings
  

После установки --no-warnings добавлено к node вызовам внутри скриптов bin .cmd ,
.ps

Я думаю, это не сработает для Linux. Мне не удалось найти универсальное решение

Связанные обсуждения: