-print 通过 npm 打印出字符串,但实际上通过 powershell 进行评估
Posted
技术标签:
【中文标题】-print 通过 npm 打印出字符串,但实际上通过 powershell 进行评估【英文标题】:-print printing out string via npm but actually evaluating through powershell 【发布时间】:2019-04-11 14:37:25 【问题描述】:我的 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=require(\"./package\");p.main=\"lib\";p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)'
如果我运行命令:
node -p 'p=require(\"./package\");p.main=\"lib\";p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)'
直接在 powershell 中我实际上得到了我正在寻找的 json 输出。
不知道为什么会有差异?我也试过用 -e/-eval 也无济于事,似乎认为它只是打印出脚本?
【问题讨论】:
【参考方案1】:将您的 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。
变化如下:
node/js 代码已被包裹在 JSON 转义双引号 \"...\"
而不是单引号中。
实际的 node/js 代码本身使用单引号 '...'
而不是 JSON 转义双引号 \"...\"
,因为在 javascript 中使用转义双引号是无效的语法。
"abc": "node -p \"p=require('./package');p.main='lib';p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)\"",
^^ ^ ^ ^ ^ ^^
【讨论】:
【参考方案2】:这是一个引用问题。
问题是运行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 代码中使用单引号并在脚本中使用双引号
"abc": "node -p \"p=require('./package');p.main='lib';p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)\""
【讨论】:
以上是关于-print 通过 npm 打印出字符串,但实际上通过 powershell 进行评估的主要内容,如果未能解决你的问题,请参考以下文章
查找并打印出字符串中特定字符的出现次数 (shell/AIX)