我的方法与@uidevthing 的回答略有不同。我不想用环境变量设置污染 package.json 文件。
您只需运行另一个脚本,将这些环境变量保存到项目根目录的.env 文件中。就是这样。
在下面的示例中,我将使用 typescript,但无论如何转换为 javascript 应该很简单。
package.json
如果您使用 javascript,则为 node scripts/start.js
...
"start": "ts-node scripts/start.ts && react-scripts start",
脚本/start.ts
新建脚本文件scripts/start.ts
const childProcess = require("child_process");
const fs = require("fs");
function writeToEnv(key: string = "", value: string = "") {
const empty = key === "" && value === "";
if (empty) {
fs.writeFile(".env", "", () => {});
} else {
fs.appendFile(".env", `${key}='${value.trim()}'\n`, (err) => {
if (err) console.log(err);
});
}
}
// reset .env file
writeToEnv();
childProcess.exec("git rev-parse --abbrev-ref HEAD", (err, stdout) => {
writeToEnv("REACT_APP_GIT_BRANCH", stdout);
});
childProcess.exec("git rev-parse --short HEAD", (err, stdout) => {
writeToEnv("REACT_APP_GIT_SHA", stdout);
});
// trick typescript to think it's a module
// https://stackoverflow.com/a/56577324/9449426
export {};
上面的代码将设置环境变量并将它们保存到根文件夹的.env 文件中。它们必须以REACT_APP_ 开头。然后 React 脚本会在构建时自动读取 .env,然后在 process.env 中定义它们。
App.tsx
...
console.log('REACT_APP_GIT_BRANCH', process.env.REACT_APP_GIT_BRANCH)
console.log('REACT_APP_GIT_SHA', process.env.REACT_APP_GIT_SHA)
结果
REACT_APP_GIT_BRANCH master
REACT_APP_GIT_SHA 042bbc6
更多参考资料: