«$ npm_execpath» не распознается как внутренняя или внешняя команда, программа или исполняемый пакетный файл - PullRequest
0 голосов
/ 21 декабря 2018

Заголовок - это ошибка, которая возникает.Я создаю сценарии в своем 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.Hc2.UI.MockServer/server.js",
    "build:dev": "npm run build:standalone:dev && npm run build:module:dev"
  },

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

yarn build / npm run build

Нов каждом из них отображается ошибка:

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

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

1 Ответ

0 голосов
/ 22 декабря 2018

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

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

  • Вкл. * 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

Примечание: Если путь не выводится на вашу консоль, когдазапустив команды, упомянутые выше, затем рассмотрите возможность переустановки пряжи и / или 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. CrossПлатформа

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

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

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

    "scripts": {
      "typecheck:watch": "yarpm run typecheck -- --watch",
      ...
    }
    
...