$npm_execpath не распознается как внутренняя или внешняя команда, программа или исполняемый пакетный файл

Заголовок - это ошибка, которая происходит. Я создаю сценарии в своем package.json, но хочу использовать npm или yarn динамически. Я читал, что для этого можно использовать переменную среды с именем $npm_execpath, но она не работает с моей конфигурацией. Это пример части package.json:

  "scripts": {
    "start": "run-p start:jsonserver start:dev",
    "start:dev": "node --max_old_space_size=4096 node_modules/webpack-dev-server/bin/webpack-dev-server.js --config ./config/webpack/webpack.standalone.dev.js --open",
    "start:prod": "webpack-dev-server --config ./config/webpack/webpack.standalone.prod.js",
    "start:container": "webpack-dev-server --host 0.0.0.0 --port 4555",
    "start:jsonserver": "node ../Testing.GtP.UI.MockServer/server.js",
    "build:dev": "npm run build:standalone:dev && npm run build:module:dev"
  },

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

yarn build / npm run build

Но в каждом из них показывают ошибку:

$npm_execpath не распознается как внутренняя или внешняя команда, программа или исполняемый пакетный файл

Я надеюсь, что вы можете мне помочь. Заранее спасибо.


person frangaliana    schedule 21.12.2018    source источник


Ответы (1)


Ссылка на переменные среды:

На переменные среды ссылаются с использованием другого синтаксиса в зависимости от операционной системы:

  • В операционных системах *nix, таких как macOS и Linux. , на них ссылаются с помощью префикса знака доллара. Например:

    $npm_execpath
    ^
    
  • В Windows они обозначаются знаком процента с обеих сторон. Например:

    %npm_execpath%
    ^            ^
    

Проверьте, существует ли переменная среды.

Во-первых, проверьте, существует ли переменная npm_execpath, временно добавив новый скрипт в раздел scripts файла package.json. Давайте назовем скрипт test-var и определим его следующим образом в зависимости от того, какую ОС вы используете:

  1. Для Windows (cmd)

    Если вы работаете в Windows, определите сценарий следующим образом:

    "scripts": {
      "test-var": "echo %npm_execpath%",
      ...
    }
    
  2. Для macOS/Linux (bash)

    Если вы используете macOS/Linux (т. е. bash), определите сценарий следующим образом:

    "scripts": {
      "test-var": "echo $npm_execpath",
      ...
    }
    

Затем вызовите сценарий, выполнив следующие команды: npm run test-var и yarn test-var.

Если переменная npm_execpath существует, вы должны увидеть путь, напечатанный на вашей консоли. Например, в macOS под управлением npm run test-var будет напечатано что-то вроде следующего:

/usr/local/lib/node_modules/npm/bin/npm-cli.js

В Windows он напечатает что-то похожее на следующее:

C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js

Он также должен печатать путь при запуске yarn test-var. Однако файл, на который указывает путь, будет ссылкой на yarn.js. Например, в macOS будет напечатано что-то вроде этого:

/Users/someone/.yarn/bin/yarn.js

Примечание. Если при выполнении команд, упомянутых выше, путь к вашей консоли не печатается, рассмотрите возможность переустановки yarn и/или npm.


Решения:

  1. Для macOS/Linux (bash)

    Используйте переменную $npm_execpath, как вы это делаете сейчас.

  2. Для Windows (cmd)

    Замените все экземпляры $npm_execpath во всех сценариях на:

    node \"%npm_execpath%\"
    

    Например, ваш текущий скрипт с именем typecheck:watch будет переопределен как:

    "scripts": {
      "typecheck:watch": "node \"%npm_execpath%\" run typecheck -- --watch",
      ...
    }
    

    В приведенном выше примере мы явно используем nodejs для вызова переменной npm_execpath. Мы также помещаем переменную npm_execpath между знаками процента (например, %...%) и также заключаем их в экранированные двойные кавычки JSON (например, \"...\").

  3. Кроссплатформенность

    Необходимость использовать различный синтаксис для каждой ОС для ссылки на переменные не идеальна, особенно если вы хотите поддерживать операционные системы Windows и * nix.

    Для единого синтаксиса, который работает на разных платформах (Windows, macOS, Linux), я предлагаю установить и использовать yarpm. В этом случае замените все экземпляры $npm_execpath в всех скриптах на yarpm.

    Например, ваш текущий скрипт с именем typecheck:watch будет переопределен как:

    "scripts": {
      "typecheck:watch": "yarpm run typecheck -- --watch",
      ...
    }
    
person RobC    schedule 22.12.2018
comment
Большое спасибо @RobC! Замечательно! Я не понял, но я использовал переменную среды Linux в Windows: S хахаха - person frangaliana; 24.12.2018