node.js - 重写 npm 脚本以兼容 windows cmd
问题描述
我正在尝试从为 linux 命令行编写的教程中运行脚本,但是在将其转换为与 windows 兼容的东西时遇到了错误。这是文章中的一行:
"build": "cd react-spa && yarn build && cd .. && cp -R react-spa/build/ public/ && mv public/index.html public/app.html"
这就是我所拥有的
cd client && yarn build && cd .. && xcopy client/build/ public/ /E && ren public/index.html app.html
这是我在终端中收到的错误消息
Invalid number of parameters npm ERR! code ELIFECYCLE npm ERR! errno 4 npm ERR! api@0.0.0 build: `cd client && yarn build && cd .. && xcopy client/build/ public/ /E && ren public/index.html app.html` npm ERR! Exit status 4 npm ERR! npm ERR! Failed at the api@0.0.0 build script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\user\AppData\Roaming\npm-cache\_logs\2020-05-01T05_29_54_552Z-debug.log
我在这里做错了什么?
解决方案
重新定义package.jsonbuild
中的脚本,如下所示:
"build": "cd react-spa && yarn build && cd .. && xcopy /e/h/y/q \"react-spa/build\" \"public\\\" > nul 2>&1 && del \"public\\app.html\" > nul 2>&1 && ren \"public\\index.html\" \"app.html\""
注意:上述 npm 脚本假设您运行的是 Windows,并且 npm 脚本使用的默认 shell 是cmd.exe
.
解释:
build
进行了以下更改以匹配与原始 npm脚本(即使用*nix命令编写的脚本)相同的行为:
以下
cp
命令:cp -R react-spa/build/ public/
已改进为使用以下
xcopy
命令:xcopy /e/h/y/q \"react-spa/build\" \"public\\\" > nul 2>&1
选项:
/e
- 复制文件夹和子文件夹,包括空文件夹。/h
- 复制隐藏和系统文件和文件夹。/y
- 抑制提示以确认覆盖文件。/q
- 复制时不显示文件名。
笔记:
每个路径名都包含在 JSON 转义双引号中,即
\"...\"
该
public\\
部分有一个尾部反斜杠 (\
),它已被 JSON 转义 (\\
),以告知xcopy
目标是一个目录。public
如果该目录尚不存在,这还可以确保创建该目录。该
> nul 2>&1
部分抑制了说明复制了多少文件的确认日志。
以下
mv
命令:mv public/index.html public/app.html
del \"public\\app.html\" > nul 2>&1 && ren \"public\\index.html\" \"app.html\"
笔记:
我们首先尝试删除该
app.html
文件,以确保后续ren
命令可以将文件重命名为index.html
,app.html
而不会由于已存在重复文件而产生任何冲突。我们重定向使用以确保在找不到文件
> nul 2>&1
时防止任何日志,即在第一次运行构建脚本期间找不到文件时。app.html
- 每个路径名都包含在 JSON 转义双引号中,即
\"...\"
. - 和命令中的
public\\index.html
部分都使用反斜杠分隔符 ( ),它已被 JSON 转义 ( )。而不是正斜杠 ( )。del
ren
\
\\
/
推荐阅读
- php - 如何在 SugarCRM 中获取与 EmailTemplate 相关的附件(注释)列表?
- c# - Visual Studio / 反射 / 序列化:我可以从调试会话中导出值以将它们用于单元测试吗?
- javascript - 将函数放入 setInterval() 时出错
- amazon-web-services - AWS Lambda、SQS、子网、互联网、多个 lambda 函数
- arrays - 将随机数添加到表格列中的每个数字
- google-analytics - 谷歌标签管理器和谷歌分析跟踪
- python - TensorFlow 模型输出大于 1 的概率值
- list - 重现数据框列表
- java - Firebase 获取价值并更改/更新它
- arrays - Swift:二维数组中的索引超出范围