распечатывать строку через npm, но на самом деле оценивать через powershell - PullRequest
0 голосов
/ 08 ноября 2018

В моем package.json определен следующий скрипт:

    "abc": "node -p 'p=require(\"./package\");p.main=\"lib\";p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)'",

Если я запускаю 'npm run-script abc', я получаю package.json со строкой

'р = требуется (\ "./ пакет \ "); p.main = \" Lib \"; p.scripts = p.devDependencies = не определено; JSON.stringify (р, нуль, 2)'

Если я запускаю команду:

node -p 'p=require(\"./package\");p.main=\"lib\";p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)'

Непосредственно в powershell я на самом деле получаю вывод json, который ищу.

Не уверен, почему разница? Я попытался использовать -e / -eval, но безрезультатно, кажется, что он просто распечатывает скрипт?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Это проблема цитирования.

Проблема в том, что выполнение npm run-script abc интерпретируется не в powershell (который должным образом поддерживает одинарные и двойные кавычки), а в cmd.

Вы можете либо:

заменить одинарные кавычки на двойные и использовать правильное экранирование (хотя результат может быть немного уродливым):

"abc": "node -p \"p=require(\\\"./package\\\");p.main=\\\"lib\\\";p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)\""

использовать одинарные кавычки внутри кода javascriptи двойные qoutes, чтобы окружить сценарий

"abc": "node -p \"p=require('./package');p.main='lib';p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)\""
0 голосов
/ 08 ноября 2018

Вместо этого измените скрипт npm на следующий:

"abc": "node -p \"p=require('./package');p.main='lib';p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)\"",

Ваш скрипт npm теперь будет успешно выполняться через Powershell , Командная строка (cmd.exe) , Linux и MacOS .

Изменения следующие:

  • Код узла / js был заключен в двойные кавычки JSON \"...\" вместо одинарных кавычек.

  • Фактический код узла / js сам использует одинарные кавычки '...' вместо экранированных двойных кавычек JSON \"...\", поскольку использование экранированных двойных кавычек в JavaScript является недопустимым синтаксисом.

"abc": "node -p \"p=require('./package');p.main='lib';p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)\"",
                ^^          ^         ^         ^   ^                                                               ^^
...