如果缺少环境变量,Gatsby 构建失败
Fail Gatsby build if environment variable missing
我尝试使用 .env.development
和 .env.production
文件将环境变量添加到我的 Gatsby 项目中,效果很好。
如果缺少其中一个环境变量,我希望我的构建失败,但是我似乎看不到如何启用此功能。
我已通读 Gatsby environment variables documentation,但似乎看不出这将如何运作?这可能吗?
我相信它在后台使用 dotenv/webpack 定义插件。
我在 Gatsby 上也找不到内置的解决方案。您可以手动完成,但仍然不太容易。
第一个问题:如果你想在 运行ning npm 脚本时从文件加载你的环境;它不能立即加载。但是你可能会触发一个脚本文件,它可以在你检查之前加载这个环境变量。
让我们在项目的根目录上说 build.sh
:
source ./.env.development # this line will set env variables
if [ "$API_KEY" = 927349872349798 ] ; then
npm run build
fi
另一个问题出现了;一些开发人员可能希望在 windows 上 运行 它。所以最好使用著名的 cross-env 包。
npm i cross-env
那么万事俱备,添加你的secure-build
:
"scripts": {
"build": "gatsby build",
"develop": "gatsby develop",
"format": "prettier --write \"**/*.{js,jsx,json,md}\"",
"start": "npm run develop",
"serve": "gatsby serve",
"clean": "gatsby clean",
"test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\" && exit 1",
"secure-build": "cross-env-shell \"./build.sh\""
},
和运行它:
npm run secure-build
这个解决方案对我来说太过分了,因为我们创建了 build.sh 并安装了一个新包。也许有更清洁的解决方案。我毕竟不是盖茨比大师
我相信还有其他方法可以做到这一点,但通过一些快速测试,这种方法似乎对我很有效。
在您的 gatsby-config.js
文件中,您可以选择明确要求 dotenv
,这样您就可以在您的配置中使用这些环境变量。
我添加了以下内容,现在除非存在指定的环境变量,否则 Gatsby 构建将失败。
// Load the environment variables, per
// https://www.gatsbyjs.org/docs/environment-variables/#server-side-nodejs
require('dotenv').config({
path: `.env.${process.env.NODE_ENV}`,
})
function checkEnv(envName) {
if (typeof process.env[envName] === 'undefined' || process.env[envName] === '') {
throw `Missing required environment variables: ${envName}`
}
}
try {
checkEnv('NODE_ENV')
checkEnv('EXAMPLE_MISSING_ENV')
checkEnv('EXAMPLE_API_KEY')
} catch (e) {
throw new Error(e)
}
// The rest of the config file
我可以想象进一步定制它,例如。为具有后备变量的变量记录警告,而不是为内容采购插件或主题所需的变量抛出错误。希望这对您有所帮助!
我尝试使用 .env.development
和 .env.production
文件将环境变量添加到我的 Gatsby 项目中,效果很好。
如果缺少其中一个环境变量,我希望我的构建失败,但是我似乎看不到如何启用此功能。
我已通读 Gatsby environment variables documentation,但似乎看不出这将如何运作?这可能吗?
我相信它在后台使用 dotenv/webpack 定义插件。
我在 Gatsby 上也找不到内置的解决方案。您可以手动完成,但仍然不太容易。
第一个问题:如果你想在 运行ning npm 脚本时从文件加载你的环境;它不能立即加载。但是你可能会触发一个脚本文件,它可以在你检查之前加载这个环境变量。
让我们在项目的根目录上说 build.sh
:
source ./.env.development # this line will set env variables
if [ "$API_KEY" = 927349872349798 ] ; then
npm run build
fi
另一个问题出现了;一些开发人员可能希望在 windows 上 运行 它。所以最好使用著名的 cross-env 包。
npm i cross-env
那么万事俱备,添加你的secure-build
:
"scripts": {
"build": "gatsby build",
"develop": "gatsby develop",
"format": "prettier --write \"**/*.{js,jsx,json,md}\"",
"start": "npm run develop",
"serve": "gatsby serve",
"clean": "gatsby clean",
"test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\" && exit 1",
"secure-build": "cross-env-shell \"./build.sh\""
},
和运行它:
npm run secure-build
这个解决方案对我来说太过分了,因为我们创建了 build.sh 并安装了一个新包。也许有更清洁的解决方案。我毕竟不是盖茨比大师
我相信还有其他方法可以做到这一点,但通过一些快速测试,这种方法似乎对我很有效。
在您的 gatsby-config.js
文件中,您可以选择明确要求 dotenv
,这样您就可以在您的配置中使用这些环境变量。
我添加了以下内容,现在除非存在指定的环境变量,否则 Gatsby 构建将失败。
// Load the environment variables, per
// https://www.gatsbyjs.org/docs/environment-variables/#server-side-nodejs
require('dotenv').config({
path: `.env.${process.env.NODE_ENV}`,
})
function checkEnv(envName) {
if (typeof process.env[envName] === 'undefined' || process.env[envName] === '') {
throw `Missing required environment variables: ${envName}`
}
}
try {
checkEnv('NODE_ENV')
checkEnv('EXAMPLE_MISSING_ENV')
checkEnv('EXAMPLE_API_KEY')
} catch (e) {
throw new Error(e)
}
// The rest of the config file
我可以想象进一步定制它,例如。为具有后备变量的变量记录警告,而不是为内容采购插件或主题所需的变量抛出错误。希望这对您有所帮助!