如何高效管理多语言React Native应用及Github分支工作流?
单仓库下多国家React Native应用的Github管理方案与工作流实践
核心思路
放弃多主分支(main-cz/main-en)的方案,回归单主分支+模块化差异隔离的模式:以main分支为核心承载所有通用代码,将不同国家的专属逻辑、资源、配置做模块化拆分,通过环境变量或构建参数实现版本切换。这种方式既保留单仓库的复用优势,又能清晰隔离国家差异,避免多分支同步的冲突问题。
1. 分支策略(Github端)
- 主分支
main:唯一的核心分支,存放所有国家共用的业务逻辑、基础组件、通用配置,以及差异模块的统一入口。所有特性开发都基于main分支拉取。 - 特性分支:
- 通用功能:命名格式
feature/[功能名称](如feature/optimize-login-flow),开发完成后直接合并回main。 - 国家专属功能:命名格式
feature/[功能名称]-[国家标识](如feature/add-cz-local-payment),开发完成后合并回main,通过模块隔离仅在对应国家版本生效。
- 通用功能:命名格式
- 发布分支:打包前创建临时发布分支,格式
release/[国家标识]-[版本号](如release/cz-v1.2.0),用于最后验证版本稳定性,发布完成后合并回main,并打上对应标签(如cz-v1.2.0)便于回溯。
2. 代码与资源隔离方案(React Native层)
(1)多语言文案隔离
用i18next或RN原生Localization工具,按国家拆分文案目录:
src/locales/ ├── cz/ │ ├── common.json │ └── payment.json └── en/ ├── common.json └── payment.json
通过环境变量APP_COUNTRY加载对应语言包,在入口初始化:
import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; import czCommon from './locales/cz/common.json'; import enCommon from './locales/en/common.json'; const resources = { cz: { common: czCommon }, en: { common: enCommon } }; i18n.use(initReactI18next).init({ resources, lng: process.env.APP_COUNTRY, fallbackLng: 'en', });
(2)业务组件/页面隔离
针对国家专属的业务逻辑,按国家拆分组件目录,通过条件渲染或动态导入加载:
src/components/Payment/ ├── cz/Payment.jsx ├── en/Payment.jsx └── index.js
在index.js中做统一导出:
import CZPayment from './cz/Payment'; import ENPayment from './en/Payment'; export default process.env.APP_COUNTRY === 'cz' ? CZPayment : ENPayment;
如果包体积敏感,可改用动态导入:
export default React.lazy(() => import(`./${process.env.APP_COUNTRY}/Payment`));
(3)配置文件隔离
创建国家专属配置文件,在入口加载对应配置:
src/config/ ├── cz.js ├── en.js └── index.js
// src/config/index.js import czConfig from './cz'; import enConfig from './en'; export const appConfig = process.env.APP_COUNTRY === 'cz' ? czConfig : enConfig;
(4)原生层(Android/iOS)差异处理
- Android:在
android/app/build.gradle中配置productFlavors,隔离应用ID、名称、资源:android { flavorDimensions "country" productFlavors { cz { dimension "country" applicationIdSuffix ".cz" resValue "string", "app_name", "XX捷克版" } en { dimension "country" applicationIdSuffix ".en" resValue "string", "app_name", "XX国际版" } } } - iOS:在Xcode中复制主Target,修改Bundle ID、App名称、资源目录,对应不同国家版本。
3. CI/CD自动化(Github Actions)
通过矩阵构建实现多版本同时打包,示例配置:
name: Build Multi-Country Releases on: push: tags: - '*-v*' jobs: build-android: runs-on: ubuntu-latest strategy: matrix: country: [cz, en] steps: - uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Install dependencies run: yarn install --frozen-lockfile - name: Build Android ${{ matrix.country }} run: cd android && ./gradlew assembleRelease -PAPP_COUNTRY=${{ matrix.country }} - name: Upload APK uses: actions/upload-artifact@v4 with: name: android-${{ matrix.country }}-release path: android/app/build/outputs/apk/release/app-${{ matrix.country }}-release.apk build-ios: runs-on: macos-latest strategy: matrix: country: [cz, en] steps: - uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Install dependencies run: yarn install --frozen-lockfile - name: Install CocoaPods run: cd ios && pod install - name: Build iOS ${{ matrix.country }} run: | cd ios xcodebuild -workspace YourApp.xcworkspace -scheme YourApp-${{ matrix.country }} -configuration Release archive -archivePath ./build/YourApp-${{ matrix.country }}.xcarchive - name: Upload Archive uses: actions/upload-artifact@v4 with: name: ios-${{ matrix.country }}-release path: ios/build/YourApp-${{ matrix.country }}.xcarchive
4. 团队协作规范
- 提交信息前缀:用国家标识或
common区分提交范围,如cz: 修复本地支付弹窗样式、common: 更新通用网络请求库。 - 代码评审:国家专属代码变更需对应区域的开发人员审核,通用代码变更需全体核心开发确认。
- 定期同步:每周固定时间(如周五)梳理各国家版本的通用优化点,合并回
main分支,避免代码分歧。
内容的提问来源于stack exchange,提问作者Zoltan Fodor
相关产品推荐
相关产品推荐

