Skip to content

Instantly share code, notes, and snippets.

@guitong
Created March 28, 2018 07:04
Show Gist options
  • Save guitong/c1992f574adbd05e28acce40afe98e96 to your computer and use it in GitHub Desktop.
Save guitong/c1992f574adbd05e28acce40afe98e96 to your computer and use it in GitHub Desktop.
cross-env 简介 (README)

The problem

当你使用NODE_ENV=production设置环境变量的时候,大多数Windows命令提示行将会choke。(例外是Bash on Windows,使用原生bash)同样地,windows和POSIX环境命令使用环境变量的方式也不同。POSIX环境下,你使用:$ENV_VAR,而windows环境使用%ENV_VAR%

This solution

cross-env可以让你使用一个命令,所有环境通用。只要遵循POSIX系统风格即可。

Installation

npm install --save-dev cross-env

Usage

例如:

{
    "scripts": {
        "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js"
    }
}

最终被执行的命令是:

webpack --config build/webpack.config.js

NODE_ENV环境变量将由cross-env设置。

你也可以将命令拆分,或者将环境变量声明从实际的命令执行中分离。如:

{
    "scripts": {
        "parentScript": "cross-env GREET=\"Joe\" npm run childScript",
        "childScript": "cross-env-shell \"echo Hello $GREET\""
    }
}

childScript拥有实际要执行的命令,parentScript中设置了将要使用的环境变量。这对于使用不同的环境变量启动相同的命令将非常有用,或者是环境变量太长导致无法将所有内容排在一行时。这同样意味着你可以在windows系统上使用$GREETenv变量语法。

如果你在美元符号前添加奇数个反斜杠,则不会替换表达式语句。请注意,这是指JSON字符串转移后的反斜杠。"FOO=\\$BAR"将不会被替换,而"FOO=\\\\$BAR"仍将替换。

最后,如果你想传入一个JSON字符串,可以这样做:

{
    "scripts": {
        "test": "cross-env TS_NODE_COMPILER_OPTIONS={\\\"module":\\\"commonjs\\\"} node some_file.test.ts"
    }
}

特别注意双引号前的三斜杠(triple backslash),且没有用单引号。这两个条件必须满足,以同时在Windows和Unix上生效。

cross-env vs. cross-env-shell

cross-env模块暴露了two bins: cross-envcross-env-shell。第一个使用cross-spawn执行命令,第二个使用Node's spawnshell选项。

cross-env-shell的主要用例时当你需要在整个內联shell脚本中设置环境变量时,而不仅仅是一个命令。

例如,如果你想将环境变量应用于几个串行的命令,那么你需要将这些变量包在引号中,并使用cross-env-shell而不是cross-env

{
  "scripts": {
    "greet": "cross-env-shell GREETING=Hi NAME=Joe \"echo $GREETING && echo $NAME\""
  }
}

The rule of thumb is: 如果你要传递一个包含你想要解释执行的特别shell字符的命令,请使用cross-env-shell。否则使用cross-env

Inspiration

I originally created this to solve a problem I was having with my npm scripts in angular-formly. This made contributing to the project much easier for Windows users.

Other Solutions

  • env-cmd - Reads environment variables from a file instead

Reference

https://www.npmjs.com/package/cross-env

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment