diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 2287978..7097d6b 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -69,6 +69,10 @@ jobs: - name: Сборка APK working-directory: apps/mobile + env: + # CI=1 — Metro без file watcher; NODE_ENV нужен expo для выбора .env-файлов + CI: "1" + NODE_ENV: production # Только arm64-v8a: C++-часть React Native собирается под каждую ABI, и четыре ABI # вместе с NDK (~2.5 ГБ) не помещаются на диск раннера. arm64 — все устройства с 2017+. run: | diff --git a/apps/mobile/metro.config.js b/apps/mobile/metro.config.js index 91411a0..6a3225d 100644 --- a/apps/mobile/metro.config.js +++ b/apps/mobile/metro.config.js @@ -1,4 +1,15 @@ // Expo SDK 52+ сам настраивает Metro для монорепо (watchFolders, nodeModulesPaths). +const path = require('node:path'); const { getDefaultConfig } = require('expo/metro-config'); -module.exports = getDefaultConfig(__dirname); +const config = getDefaultConfig(__dirname); + +// watchFolders включает весь apps/mobile, а без watchman Metro обходит и хэширует каждый файл. +// android/ и ios/ после prebuild содержат гигабайты промежуточных файлов Gradle/CMake — +// в release-сборке Metro на них «висит». В JS-бандл из этих папок ничего не попадает. +const escape = (p) => p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +const nativeDirs = ['android', 'ios'].map((d) => new RegExp(`^${escape(path.join(__dirname, d) + path.sep)}.*`)); + +config.resolver.blockList = [...[].concat(config.resolver.blockList ?? []), ...nativeDirs]; + +module.exports = config;