React Native+Fastlane:设置ENV变量后JS无法获取的问题求助
解决React Native无法读取Fastlane设置的环境变量问题
核心原因
Fastlane进程的环境变量和React Native的JS打包进程(metro)是隔离的,直接设置ENV变量无法自动传递到JS环境,需要通过文件写入、显式传递变量到构建命令或原生配置注入三种方式解决。
方案1:构建时生成JS配置文件(最可靠)
直接在Fastlane中将获取到的构建信息写入一个JS文件,RN代码直接导入使用:
- 在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
- 在RN的JS代码中导入使用:
import { BuildInfo } from './src/build-config'; // 直接使用 console.log('当前构建号:', BuildInfo.buildNumber);
方案2:显式传递变量到RN构建命令(用process.env)
如果一定要用process.env,需要在构建时将变量传递给RN的打包命令,并通过babel插件注入:
- 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
- 安装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'] // 要注入的变量名 }] ] };
- 在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
相关产品推荐
相关产品推荐

