NodeJS:无法通过带有 start-server-and-test 的包脚本设置 PERCY_TOKEN

Nor*_*ldt 5 javascript yarnpkg visual-testing cypress percy

我一直在努力PERCY_TOKEN根据percy的官方指南在本地测试运行中设置它,并通过yarn.

指南说:

$ PERCY_TOKEN=aaabbbcccdddeeefff PERCY_BRANCH=local npm test
Run Code Online (Sandbox Code Playgroud)

我现在的尝试是这样的:

包.json

$ PERCY_TOKEN=aaabbbcccdddeeefff PERCY_BRANCH=local npm test
Run Code Online (Sandbox Code Playgroud)

...
"scripts": {
    "start": "react-scripts -r @cypress/instrument-cra start",
    "start:silent": "BROWSER=none yarn start",
    "start:server": "start-server-and-test start:silent http://localhost:3000",
    "build": "react-scripts build",
    "eject": "react-scripts eject",
    "envGenerateExample": "cat .env | sed 's/=.*/=/g' > .env.example",
    "jest:test": "react-scripts test --env=jest-environment-jsdom-sixteen",
    "cy:run": " 'yarn start:server './node_modules/.bin/cypress run'",
    "cy:open": "yarn start:server './node_modules/.bin/cypress open'",
    "cy:ci": "yarn start:server cy:chrome",
    "cy:chrome": "cypress run --browser chrome --record",
    "percy:exec": "yarn percy exec -- cypress run",
    "cy:percy": "yarn start:server percy:exec",
    "percy:local": "PERCY_TOKEN=$(grep 'PERCY_TOKEN.*' .env | sed 's/.*=//'); PERCY_BRANCH=local;",
    "cy:percy:local": "yarn percy:local && yarn start:server percy:exec"
  },
...
Run Code Online (Sandbox Code Playgroud)

TL;DR 解决方案

包.json

$ yarn cy:percy:local

Compiled successfully!

You can now view playground in the browser.

  Local:            http://localhost:3000
  On Your Network:  http://192.168.1.163:3000

Note that the development build is not optimized.
To create a production build, use yarn build.

...

> playground@0.2.0 percy:exec /Users/norfeldt/Repos/playground
> yarn percy exec -- cypress run

warning From Yarn 1.0 onwards, scripts don't require "--" for options to be forwarded. In a future version, any explicit "--" will be forwarded as-is to the scripts.
$ /Users/norfeldt/Repos/playground/node_modules/.bin/percy exec cypress run
 ›   Warning: Skipping visual tests. PERCY_TOKEN was not provided.
...
Run Code Online (Sandbox Code Playgroud)

Sag*_*iga 4

纱线内部用于sh执行脚本中给出的命令(cmd如果是Windows)-。这与npm 的做法非常相似。

这里&&是由 shell 处理的,因此您的命令yarn percy:local && yarn start:server percy:exec作为 2 个单独的子进程运行。这意味着yarn percy:local在一个进程中运行并根据需要在其上下文中设置环境变量,但正在运行的第二个进程yarn start:server percy:exec不知道进程 1 设置的环境变量。

让我们看看 OS X 如何处理这个问题:

  1. &&
sh -c 'PERCY_TOKEN=asdfasdf; PERCY_BRANCH=local' &&  sh -c 'echo $PERCY_TOKEN'
Run Code Online (Sandbox Code Playgroud)

这不打印任何内容

  1. 没有&&
sh -c 'PERCY_TOKEN=asdfasdf; PERCY_BRANCH=local echo $PERCY_TOKEN'
Run Code Online (Sandbox Code Playgroud)

这打印asdfasdf

我认为删除&&应该cy:percy:local可以解决您的问题。

编辑:针对评论中讨论的特定情况的解决方案

正如这个答案的第二点所解释的:stackoverflow.com/a/37141993/8266093 我建议您以ENV_KEY1=value1 ENV_KEY2=value2 command在您的情况下成为的格式运行此脚本PERCY_TOKEN=$(grep 'PERCY_TOKEN.*' .env | sed 's/.*=//') PERCY_BRANCH=local yarn percy exec cypress run。除此之外,如果单独运行它不适合您,您也可以添加启动服务器纱线命令。