Legacy

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, ничего интересного. Надеюсь на выходных спать спокойно.

Да, в metro bundler, местной версии вебпака нет symlinks. Пока. Поэтому wix придумала wml

Вот гист https://gist.github.com/ptmt/a130f03814eadaf25318c39750b70b3f который решает проблему, но пока не выглядит оконченным результатом.

Report Page