Legacy
react-native-workaroundНу хорошо, не очень уж и легаси, но уже довольно давно в активной разработке. Что имеем.
- В приоритете была только Андроид версия.
- Много кода, с кучей нативных плагинов.
- Нет flow и typescript.
- Нет prettier.
- Есть немного тестов, которые правда никак никуда не интегрированы в CI.
- Есть Fastlane, но см. предыдущий пункт.
Первым делом после установки всех зависимостей я вижу что проект не билдится, просто потому что установлен Android SDK 25, а в десятках разных плагинов внутри build.gradle старая версия. Можно отправить пулл реквест и ждать, а можно форкнуть и заполонить свой package.json прямыми ссылками на форками. Быстрофикс это fix_android_sdk.sh на время, который выполняется после yarn:
find ./ -type f -name "build.gradle" | xargs sed -i '' -e 's/compileSdkVersion 23/compileSdkVersion 25/g' find ./ -type f -name "build.gradle" | xargs sed -i '' -e 's/23.0.0/25.0.3/g' find ./ -type f -name "build.gradle" | xargs sed -i '' -e 's/23.0.1/25.0.3/g' find ./ -type f -name "build.gradle" | xargs sed -i '' -e 's/minSdkVersion 16/minSdkVersion 19/g'
Это работает вообще после любых breaking change. Вы должны не забывать о детерминированности билда. (Хотел хоть что-нибудь выделить болдом) Поэтому мой алгоритм такой — поправить локально, отправить фикс, но чтобы работать здесь и сейчас, нужно добавить такой костыль-скрипт. (Хотя использовать форк тоже приходится часто, спасибо мейнтенерам, которые могут забросить проект).
Вторым — я получаю multidex issue, знаменитый Unable to execute dex: Multiple dex files define. Оказалось, что проект уперся в ограничения и надо было убрать из этапов компиляции здоровый кусок:
compile(project(':react-native-google-sign-in')){ exclude group: "com.google.android.gms" }
Третьим — дебажим packager, который настроен на multple roots. Есть сейчас встроенные дебаггеры, но я по старинке:
node --inspect-brk ./node_modules/react-native/local-cli/cli.js.
Кстати, как он может быть настроен, если у вас есть смежные папки в которых надо искать мдули. Поможет всемогущий rn-cli.config.js (файл который может конфигурировать поведение консольного интерфейса react-native):
module.exports = { getProjectRoots() { return [path.resolve(__dirname), path.resolve(__dirname, '../common')]; }, }
Теперь всё билдится и запускается. Ну а дальше — Contributing.md, синхронизация и настройка окружение и так далее, уже не специфичное React Native, ничего интересного. Надеюсь на выходных спать спокойно.
Бонус: плач про Symlinks
Да, в metro bundler, местной версии вебпака нет symlinks. Пока. Поэтому wix придумала wml
Вот гист https://gist.github.com/ptmt/a130f03814eadaf25318c39750b70b3f который решает проблему, но пока не выглядит оконченным результатом.