我使用了本教程:https://github.com/gatsbyjs/gatsby/blob/master/docs/docs/environment-variables.md
我遵循的步骤:
1)安装dotenv@4.0.0
2)在根文件夹中创建两个文件:" .env.development"和" .env.production"
3)"按照他们的设置说明" (关于dotenv npm docs的例子)
在gatsby-config.js
:
const fs = require('fs');
const dotenv = require('dotenv');
const envConfig =
dotenv.parse(fs.readFileSync(`.env.${process.env.NODE_ENV}`));
for (var k in envConfig) {
process.env[k] = envConfig[k];
}
不幸的是,当我运行gatsby develop
时,NODE_ENV
尚未设置:
error Could not load gatsby-config
Error: ENOENT: no such file or directory, open 'E:\Front-End Projects\Gatsby\sebhewelt.com\.env.undefined'
我手动设置时可以正常工作:
dotenv.parse(fs.readFileSync(`.env.development`));
我需要gatsby-config中的环境变量,因为我将敏感数据放在这个文件中:
{
resolve: `gatsby-source-contentful`,
options: {
spaceId: envConfig.CONTENTFUL_SPACE_ID,
accessToken: envConfig.CONTENTFUL_ACCESS_TOKEN
}
}
如何让它发挥作用?
PS:补充问题 - 因为这让我想到了,我知道我不应该在github上放置密码和令牌,但是从github构建netlify,还有其他安全方法吗?答案 0 :(得分:5)
我有一个类似的问题,我在根“.env.development”和“.env.production”中创建了2个文件,但仍然无法访问env文件变量 - 它在我的gatsby-config中返回undefined .js文件。
通过安装dotenv的npm工作并执行此操作:
1)当运行gatsby develop
process.env.NODE_ENV返回undefined时,但是当运行gatsby build
时它返回'production',所以我在这里定义它:
let env = process.env.NODE_ENV || 'development';
2)然后我使用了dotenv但是根据process.env.NODE_ENV指定了文件路径
require('dotenv').config({path: `./.env.${env}`});
3)然后您可以访问配置的变量:
module.exports = {
siteMetadata: {
title: `Gatsby Default Starter`,
},
plugins: [
`gatsby-plugin-react-helmet`,
{
resolve: `gatsby-source-contentful`,
options: {
spaceId: `${process.env.CONTENTFUL_ID}`,
accessToken: `${process.env.CONTENTFUL_TOKEN}`,
},
},
],
}
答案 1 :(得分:4)
您应该只在使用env文件时才能使用env文件。对于密码/令牌/等。将它们添加到Netlify或您通过其仪表板使用的任何构建工具。
您可以访问gatsby-config.js& gatsby-node.js通过process.env.ENV_VARIABLE
。
但是,您无法在浏览器中访问以这种方式添加的环境变量。为此,您需要使用.env.development
& .env.production
。
答案 2 :(得分:0)
经过几次搜索,我发现我们可以通过netlify网站设置环境变量,步骤如下:
答案 3 :(得分:0)
我真的不喜欢.env.production
文件模式,我们的构建系统设置并使用env变量,并且有多余的构建步骤将这些变量写入文件是很奇怪的。但是盖茨比只将环境变量的GATSBY_
列入白名单,而没有明显的添加自己的方法。
但是这样做并不难,您可以通过在gatsby-node.js
文件中添加如下内容来实现:
exports.onCreateWebpackConfig = ({ actions, getConfig }) => {
const config = getConfig();
// Allow process.env.MY_WHITELIST_PREFIX_* environment variables
const definePlugin = config.plugins.find(p => p.definitions);
for (const [k, v] of Object.entries(process.env)) {
if (k.startsWith("MY_WHITELIST_PREFIX_")) {
definePlugin.definitions[`process.env.${k}`] = JSON.stringify(v);
}
}
actions.replaceWebpackConfig(config);
};