如何在Vercel的Monorepo中为每个项目配置独立环境变量?
在Turborepo + Vercel 中管理多站点Monorepo的环境变量
完全不需要放弃Monorepo,Vercel原生支持Turborepo多项目的环境变量隔离管理,以下是几种落地可行的方案:
方案1:Vercel项目级独立配置
每个站点(website-1、website-2)在Vercel上作为独立项目维护,但保留Monorepo结构:
- 在Vercel中为每个站点创建单独项目,关联同一个Monorepo仓库
- 进入每个项目的「Settings → Environment Variables」,配置专属的
AIRTABLE_BASE_ID等变量 - 在
turbo.json中为每个站点的构建任务声明需要传递的环境变量:{ "tasks": { "build": { "dependsOn": ["^build"], "outputs": ["public/**"] }, "website-1#build": { "env": ["AIRTABLE_BASE_ID"] }, "website-2#build": { "env": ["AIRTABLE_BASE_ID"] } } } - 部署时每个站点独立触发构建,Vercel会自动注入对应项目的专属变量
方案2:结合.env文件与Turbo变量传递
如果想保留本地的.env文件结构,同时在Vercel上统一管控:
- 在Monorepo根目录为每个站点创建专属环境文件,比如
.env.website-1.production、.env.website-2.production - 在每个站点的Vercel项目设置中,添加
ENV_FILE变量,值为对应站点的环境文件名(如.env.website-1.production) - 修改站点的Gatsby配置或构建脚本,根据
ENV_FILE加载对应变量:require('dotenv').config({ path: process.env.ENV_FILE || '.env.production' }) - Turbo会在构建时传递Vercel注入的
ENV_FILE变量,确保每个站点加载正确配置
方案3:全局+局部变量组合管理
- 把所有站点通用的变量(如公共API域名)放在Monorepo根目录,通过Vercel团队级环境变量统一配置
- 每个站点的专属变量(如
AIRTABLE_BASE_ID)在各自的Vercel项目中单独配置 - 在
turbo.json中声明全局和任务级变量的传递规则:{ "globalEnv": ["COMMON_API_URL"], "tasks": { "build": { "dependsOn": ["^build"], "outputs": ["public/**"], "env": ["AIRTABLE_BASE_ID"] } } }
额外注意事项
- Gatsby变量规则:前缀为
GATSBY_的变量会自动暴露到浏览器端,服务端专用变量无需前缀,但要确保构建时已注入 - Vercel根目录配置:每个站点的Vercel项目需在「General → Root Directory」中填写站点的相对路径(如
website-1-using-theme) - Turbo缓存处理:如果环境变量变更,构建时需添加
--force参数,或在turbo.json中配置缓存键包含环境变量,避免使用旧缓存
内容的提问来源于stack exchange,提问作者Mattia Rasulo
相关产品推荐
相关产品推荐

