首页 > 解决方案 > 重写 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

我在这里做错了什么?

标签: node.jsnpmnpm-scripts

解决方案


重新定义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命令编写的脚本)相同的行为:

  1. 以下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部分抑制了说明复制了多少文件的确认日志。

  2. 以下mv命令:

    mv public/index.html public/app.html
    

    已改进为同时使用delren命令,如下所示:

    del \"public\\app.html\" > nul 2>&1 && ren \"public\\index.html\" \"app.html\"
    

    笔记:

    • 我们首先尝试删除该app.html文件,以确保后续ren命令可以将文件重命名为index.htmlapp.html而不会由于已存在重复文件而产生任何冲突。

      我们重定向使用以确保在找不到文件> nul 2>&1时防止任何日志,即在第一次运行构建脚本期间找不到文件时。app.html

    • 每个路径名都包含在 JSON 转义双引号中,即\"...\".
    • 和命令中的public\\index.html部分都使用反斜杠分隔符 ( ),它已被 JSON 转义 ( )。而不是正斜杠 ( )。delren\\\/


推荐阅读