You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native+Fastlane:设置ENV变量后JS无法获取的问题求助

解决React Native无法读取Fastlane设置的环境变量问题

核心原因

Fastlane进程的环境变量和React Native的JS打包进程(metro)是隔离的,直接设置ENV变量无法自动传递到JS环境,需要通过文件写入、显式传递变量到构建命令或原生配置注入三种方式解决。


方案1:构建时生成JS配置文件(最可靠)

直接在Fastlane中将获取到的构建信息写入一个JS文件,RN代码直接导入使用:

  1. 在Fastlane lane中添加写入逻辑:
# Fastfile示例代码
lane :prepare_build_info do
  # 获取所需信息(根据你的实际逻辑调整)
  build_number = get_build_number
  git_hash = `git rev-parse --short HEAD`.strip
  changelog = fetch_changelog # 假设你有获取变更日志的逻辑

  # 处理特殊字符,避免JS语法错误
  escaped_changelog = changelog.gsub('"', '\\"').gsub("\n", "\\n")

  # 写入RN项目中的配置文件(路径自行调整)
  File.write("./src/build-config.js", <<~JS)
    export const BuildInfo = {
      buildNumber: "#{build_number}",
      gitHash: "#{git_hash}",
      changelog: "#{escaped_changelog}"
    };
  JS
end
  1. 在RN的JS代码中导入使用:
import { BuildInfo } from './src/build-config';

// 直接使用
console.log('当前构建号:', BuildInfo.buildNumber);

方案2:显式传递变量到RN构建命令(用process.env)

如果一定要用process.env,需要在构建时将变量传递给RN的打包命令,并通过babel插件注入:

  1. Fastlane中执行构建命令时带上变量:
lane :build_ios do
  build_number = get_build_number
  git_hash = `git rev-parse --short HEAD`.strip

  # 执行RN构建时传递环境变量
  sh "BUILD_NUMBER=#{build_number} GIT_HASH=#{git_hash} npx react-native build-ios"
end

lane :build_android do
  build_number = get_build_number
  git_hash = `git rev-parse --short HEAD`.strip

  sh "BUILD_NUMBER=#{build_number} GIT_HASH=#{git_hash} npx react-native build-android"
end
  1. 安装babel插件并配置:
    安装依赖:
npm install babel-plugin-transform-inline-environment-variables --save-dev

修改babel.config.js:

module.exports = {
  presets: ['module:metro-react-native-babel-preset'],
  plugins: [
    ['transform-inline-environment-variables', {
      include: ['BUILD_NUMBER', 'GIT_HASH', 'CHANGELOG'] // 要注入的变量名
    }]
  ]
};
  1. 在RN代码中使用:
console.log('构建号:', process.env.BUILD_NUMBER);
console.log('Git哈希:', process.env.GIT_HASH);

方案3:注入原生配置(iOS/Android分别处理)

将构建信息写入原生项目的配置文件,RN通过原生模块读取:

iOS:修改Info.plist

# Fastlane lane代码
lane :update_ios_build_info do
  build_number = get_build_number
  git_hash = `git rev-parse --short HEAD`.strip

  update_info_plist(
    xcodeproj: "./ios/YourProject.xcodeproj",
    plist_path: "./ios/YourProject/Info.plist",
    block: proc do |plist|
      plist['BuildNumber'] = build_number
      plist['GitHash'] = git_hash
    end
  )
end

之后可以通过react-native-info-plist库或自定义原生桥接读取Info.plist中的值。

Android:修改build.gradle

# Fastlane lane代码
lane :update_android_build_info do
  build_number = get_build_number
  git_hash = `git rev-parse --short HEAD`.strip

  # 修改app/build.gradle中的buildConfigField
  gradle_file_path = "./android/app/build.gradle"
  gradle_content = File.read(gradle_file_path)
  
  # 替换或添加BUILD_NUMBER字段
  gradle_content = gradle_content.gsub(
    /buildConfigField "String", "BUILD_NUMBER", ".+"/,
    "buildConfigField \"String\", \"BUILD_NUMBER\", \"#{build_number}\""
  )
  # 处理GIT_HASH字段
  gradle_content = gradle_content.gsub(
    /buildConfigField "String", "GIT_HASH", ".+"/,
    "buildConfigField \"String\", \"GIT_HASH\", \"#{git_hash}\""
  )

  File.write(gradle_file_path, gradle_content)
end

之后通过RN的NativeModules读取Android原生的BuildConfig值。


常见注意事项

  • 特殊字符处理:变更日志中的换行、引号需要转义,否则会导致JS或配置文件语法错误。
  • 缓存清理:修改配置后如果RN没有更新,执行npx react-native start --reset-cache清除metro缓存。
  • 变量作用域:Fastlane的ENV变量仅在自身进程有效,必须显式传递给子进程(RN构建命令)或写入文件才能被RN读取。

内容的提问来源于stack exchange,提问作者Jan Bouchner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:31:35