【问题标题】:configuring package.json on windows在 windows 上配置 package.json
【发布时间】:2018-11-14 18:05:00
【问题描述】:

我正在尝试在 windows 上管理 react 项目的配置,它以前在 mac 上运行。我正在使用yarn build。在package.json 内部,scripts>build 被配置为"rm-rf deployment/static;react-scripts build && mv build deployment/static"。由于rm-rfmv 命令适用于Linux,我尝试使用rmdir/delmove 来代替......但它似乎不起作用。我收到错误消息:Parameter format not correct - "static"

【问题讨论】:

  • 您是否正在寻找仅适用于 Windows 的同等产品?或者确保您的build 脚本跨平台(即 Windows/Linux/Mac)成功运行的解决方案?
  • @RobC 它在 mac 上运行良好。我正在寻找适用于 Windows 的解决方案。

标签: reactjs npm package.json yarnpkg npm-scripts


【解决方案1】:

Windows 解决方案 (cmd.exe)

在 Windows 上通过 命令提示符PowerShell 运行的 build 脚本的等价物是:

"scripts": {
  "build": "rd /s/q \"deployment/static\" 2> nul & react-scripts build && md \"deployment/static\" && move \"build\" \"deployment/static\""
}

说明:

  1. Windows (cmd.exe) 的 rm-rf 等效项是 rd /s/q
  2. Windows (cmd.exe) 的 mv 等效项是 move
  3. 所有目录路径都用转义双引号 \"...\" 包裹。例如;

    deployment/static 已改写为\"deployment/static\"

    虽然在这种情况下转义双引号并不是完全必要的,但当路径可能包含空格或标点字符时,这是一种很好的做法并且是必要的。

  4. 分号; 已替换为单个& 运算符,以确保react-script build 部分运行,无论初始rd /s/q ... 命令是失败还是成功。

    李>
  5. 使用rd 删除可能不存在的文件夹/路径时,控制台会打印以下错误消息:

    系统找不到指定的路径

    为了防止此错误消息可能被打印到控制台,我们使用 2> nul 部分将错误消息重定向到 NUL

  6. md \"deployment/static\" 部分利用 Windows md 命令创建 static 目录 - 这与 bash 中的 mkdir 命令非常相似。

注意:上述语法在基于 nix 的操作系统(例如 macOS 和 Linux)上会失败。


跨平台解决方案(Windows/Linux/macOS...)

为了实现跨平台解决方案(即在 Windows、Linux 和 macOS 上成功运行的解决方案),我建议编写两个 Nodejs 实用程序脚本来替代 rm -rfmv bash 命令。然后可以通过您的 npm-script 调用这两个 Nodejs 脚本。

以下步骤描述了如何实现这一点。

  1. 安装shelljs,它为 Nodejs 提供可移植的 Unix shell 命令。为此,cd 到您的项目目录并运行以下命令:

    npm i -D shelljs
    
  2. 创建一个名为rm.js 的新Nodejs 脚本,内容如下:

    rm.js

    const shell = require('shelljs');
    
    const args = process.argv.slice(2);
    const dir = args[0];
    
    shell.rm('-rf', dir);
    

    将此文件保存在项目目录的根目录中,与项目package.json 的存储位置相同。

  3. 创建另一个名为 mv.js 的 Nodejs 脚本,内容如下:

    mv.js

    const shell = require('shelljs');
    
    const args = process.argv.slice(2);
    const src = args[0];
    const dest = args[1];
    
    // Check src path has been provided and is valid
    if (!src || !shell.test('-d', src)) {
      console.log('\x1b[31m\x1b[40mERR!\x1b[0m src path cannot be found: %s', src);
      process.exit(1);
    }
    
    // Check dest path has been provided.
    if (!dest) {
      console.log('\x1b[31m\x1b[40mERR!\x1b[0m dest path must be provided:');
      process.exit(1);
    }
    
    // Make dest directory if necessary.
    shell.mkdir('-p', dest);
    
    // Move the file.
    shell.mv(src, dest);
    

    将此文件保存在项目目录的根目录中,与项目package.json 的存储位置相同。

  4. 然后在package.json中配置你的build脚本如下:

    "scripts": {
      "build": "node rm \"deployment/static\" & react-scripts build && node mv \"build\" \"deployment/static\""
    }
    

注意

rm.jsmv.js 两个实用脚本在名为 buildnpm-script 中通过部分读取调用;分别为node rm ...node mv ...

如果您决定将这两个脚本存储在不同的文件夹而不是项目根目录中(如前面步骤 2 和 3 中所建议的那样),那么您需要更改文件的路径。例如;如果它们都保存在一个名为 scripts 的文件夹中,该文件夹位于项目目录的根目录中,那么您的 build 脚本将更改为:

"scripts": {
  "build": "node scripts/rm \"deployment/static\" & react-scripts build && node scripts/mv \"build\" \"deployment/static\""
}

编辑/更新:

另一种跨平台解决方案(最初发布此答案时不可用)是利用 shx 包,描述为:

shx 是对ShellJS Unix 命令的封装,为 npm 包脚本中的简单的类 Unix、跨平台命令提供简单的解决方案

  1. 运行以下命令安装shx

    npm i -D shx
    
  2. 然后将package.json 中的构建脚本更改如下:

    "scripts": {
      "build": "shx rm -rf deployment/static & react-scripts build && shx mv build deployment/static"
    }
    

【讨论】:

  • 在项目中手动删除并创建静态文件夹后,它与 rmdir 一起使用。抱歉回复晚了。
  • 不用担心@izengod - 在 Windows 中 rmdir /s/qrd /s/qequivalent,所以它应该适用于任何一个。当文件夹不为空时,/s 参数是必需的。
  • 好答案。 Windows 环境可能不需要步骤 md \"deployment/static\",因为它会将 build 文件夹复制到静态文件夹下,而不仅仅是复制静态文件夹。
【解决方案2】:

出于这个原因,我使用rimraf。 全局安装

    npm i -g rimraf

并按如下方式更新您的脚本

    "rimraf deployment/static;react-scripts build && mv build deployment/static"

【讨论】:

  • $ rimraf deployment/static;react-scripts build && move build deployment/static 系统找不到指定的文件。错误命令失败,退出代码为 1。
【解决方案3】:

shx 包应该工作得很好;他们甚至在最顶层的 package.json 演示中显示 rm -rf

【讨论】:

    【解决方案4】:

    对于 Windows:

    在客户文件夹中

      },
      "scripts": {
        "build-win": "react-scripts build && move build ..\\server\\public",
      },
    

    这会将文件夹移动到服务器文件夹

    【讨论】:

      猜你喜欢
      • 2018-12-31
      • 2015-08-30
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2018-08-02
      相关资源
      最近更新 更多