我已经搜索了(官方文件和感觉像是所有互联网的东西),并测试了多种方法,但我永远也无法通过GitLab管道来理解VITE中的环境变量.

对于CRA,这很有效(使用CREATE_APP_var1).

现在,我的管道中有了以下设置,部署到开发人员和生产人员得到了不同的变量值集(为简洁起见):

stages:
  - build
  - image
  - chart
  - deploy
.build:
  stage: build
  image: node:16
  variables:
    CI: 'false'
    VITE_ENV: '$ENVIRONMENT'
    VITE_COMMIT: '$CI_COMMIT_MESSAGE'
  before_script:
    - printenv | grep -E '^(VITE_|ENVIRONMENT)' # this is to print what gitlab sees, and it sees the correct values from `build:dev:`-step
  script:
    - npm ci
    - npm run build
  artifacts:
    paths:
      - build
    expire_in: 2 weeks

build:dev:
  extends:
    - .build
  environment:
    name: Dev
  variables:
    ENVIRONMENT: 'development'
    IMAGE_NAME: 'image/path'
    VITE_var1: 'value1'
    VITE_TESTMESSAGE: 'This is a test message'
  only:
    - develop-branch

build:prod:
  extends:
    - .build
  variables:
    ENVIRONMENT: 'production'
    VITE_BUILD: '$CI_COMMIT_TAG'
    VITE_var1: 'value1'
    VITE_var2: 'value2'
  only:
    variables:
      - $CI_COMMIT_TAG =~ /^\d+\.\d+\.\d+$/

因此,我的流水线在推送到Development-BRANCH的任何提交时触发,并且对于生产只使用标记提交.到目前一切尚好.

在我的存储库中,我还有以下文件:

  • .env.Development.local-加载良好,本地主机具有开发价值
  • .env.Products-这在生产中有效,所有值都会被加载

现在,当我通过扩展Build:Dev传递到构建阶段时,我假设VITE_var1VITE_TESTMESSAGE的值将"战胜"任何其他同名的变量.我像这样访问代码中的值,只是为了验证它是否工作:

config.js
console.log('VITE_var1 env', import.meta.env.VITE_var1); // returns prod value
console.log('VITE_TESTMESSAGE env', import.meta.env.VITE_TESTMESSAGE); // returns undefined

无论我在这里做什么,我都会从.env.product获取值(在运行dev-Steps时),并且忽略ci文件中设置的变量.

我还try 设置.env.Development并在Package.json中运行单独的构建-开发脚本:

"build-dev": "tsc && vite build --mode development",

如果ci提交分支==开发分支:

- if [[ "$CI_COMMIT_BRANCH" == "Dev" ]]; then npm run build-dev; else npm run build; fi

任何关于我在这里显然不理解的问题的提示都将不胜感激.

推荐答案

经过几天的反复试验,我们终于找到了问题所在.在这里发布我们的解决方案,以防其他人陷入类似的困境.

这主要是一个源于无知的问题.当我们试图用build步来解决一切问题时,我们找错了对象.

我们有image个步骤,其中image:devimage:prod个变量实际上就是问题所在.因此,为了修复它,我们将映像步骤更改为指向两个不同的dockerfile实例(使用kaniko),并在每个实例中分别运行tsc && vite build(Prod)和tsc && vite build --mode development(Dev).

这使得不同的映像步骤基于代码部署到的位置(分支)而与存储库中的.env.production.env.development相关.

Reactjs相关问答推荐

CSS转换不适用于React MUI对象

无法覆盖MUI工具栏上的左右填充,除非使用!重要

在一个地方调用函数会影响其他地方调用该函数

Redux向后端发送请求时出现钩子问题

如何将图像(在代码中称为自己)定位在蓝色圈内的点上?我正在使用material UI和Reaction

GitHub页面未正确显示Reaction应用程序网站

ctx.strokeStyle 在 canvas html 5 中不起作用

生产部署:控制台中 Firebase 无效 api 密钥错误

ReactJS 共享上下文

拖放 - 将排序保存到数组字段

对于 ref 上的可见 prop 或 open 方法来react 组件,哪种方式更好?

React中的功能性组件克隆优化

在react 中单击父级中的按钮时如何将数据从子级发送到父级?

将 clerk 与 supabase 集成的最佳实践

在 React 中,为什么在使用 addEventListener 时外部元素上的 onclick 事件监听器在内部元素的 onclick 事件监听器之前执行?

状态链接未传递到路由页面

Wordpress 插件在激活时创建一个 React Public 页面

我正在try 使用 cypress 测试我的下拉列表,它 Select 值但不提交它们(手动工作)

当用户输入相同信息时如何禁用更新

axios post方法中的请求失败,状态码为500错误