Формирование ошибки йоги React Native из источника
Я пытаюсь построить React Native из источника, чтобы использовать некоторые изменения, которые я внес в его функции Camera Roll. Я следил за руководством, как это сделать, но при попытке собрать все это я столкнулся с некоторыми непонятными загадочными ошибками.
Вот целая куча:
[armeabi-v7a] Compile++ thumb: yogacore <= Utils.cpp
[armeabi-v7a] Compile++ thumb: yogacore <= YGEnums.cpp
[armeabi-v7a] Compile++ thumb: yogacore <= YGNodePrint.cpp
[armeabi-v7a] Compile++ thumb: yogacore <= YGNode.cpp
[armeabi-v7a] Compile++ thumb: yogacore <= Yoga.cpp
C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/../ReactCommon/yoga/yoga/YGEnums.cpp:228:1: fatal error: opening dependency file C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGEnums.o.d: No such file or directory
}
^
compilation terminated.
make.exe: *** [C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGEnums.o] Error 1
make.exe: *** Waiting for unfinished jobs....
[armeabi-v7a] StaticLibrary : libreactnative.a
C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/../ReactCommon/yoga/yoga/YGNodePrint.cpp:227:1: fatal error: opening dependency file C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGNodePrint.o.d: No such file or directory
} // namespace facebook
^
compilation terminated.
make.exe: *** [C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGNodePrint.o] Error 1
C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/../ReactCommon/yoga/yoga/Utils.cpp:31:1: fatal error: opening dependency file C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/Utils.o.d: No such file or directory
}
^
compilation terminated.
make.exe: *** [C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/Utils.o] Error 1
C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/../ReactCommon/yoga/yoga/YGNode.cpp:668:1: fatal error: opening dependency file C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGNode.o.d: No such file or directory
}
^
compilation terminated.
make.exe: *** [C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGNode.o] Error 1
C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/../ReactCommon/yoga/yoga/Yoga.cpp:3493:1: fatal error: opening dependency file C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/Yoga.o.d: No such file or directory
}
^
compilation terminated.
make.exe: *** [C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/Yoga.o] Error 1
make.exe: Leaving directory 'C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/src/main/jni/react/jni'
:ReactAndroid:buildReactNdkLib FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':ReactAndroid:buildReactNdkLib'.
> Process 'command 'C:\Users\jon-g\AppData\Local\Android\Ndk\android-ndk-r10e\ndk-build.cmd'' finished with non-zero exit value 2
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Ничто из этого не имеет большого значения для меня. Эти пути файлов совершенно смехотворны.
Почему это происходит? Как мне его собрать?
Ответы
Ответ 1
Добавить в Podfile
: (Ссылка: facebook/yoga # 711)
def fix_cplusplus_header_compiler_error
filepath = '../node_modules/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceSizeMeasureMode.h'
contents = []
file = File.open(filepath, 'r')
file.each_line do | line |
contents << line
end
file.close
if contents[32].include? "&"
contents.insert(26, "#ifdef __cplusplus")
contents[36] = "#endif"
file = File.open(filepath, 'w') do |f|
f.puts(contents)
end
end
end
def fix_unused_yoga_headers
filepath = './Pods/Target Support Files/yoga/yoga-umbrella.h'
contents = []
file = File.open(filepath, 'r')
file.each_line do | line |
contents << line
end
file.close
if contents[12].include? "Utils.h"
contents.delete_at(15) # #import "YGNode.h"
contents.delete_at(15) # #import "YGNodePrint.h"
contents.delete_at(15) # #import "Yoga-internal.h"
contents.delete_at(12) # #import "Utils.h"
file = File.open(filepath, 'w') do |f|
f.puts(contents)
end
end
end
def react_native_fix
fix_cplusplus_header_compiler_error
fix_unused_yoga_headers
end
post_install do |installer|
react_native_fix
end
И измените package.json
чтобы исправить ошибку рыболовного крючка: (Ссылка: facebook/react-native # 16039)
"scripts": {
"postinstall": "sed -i '' 's/#import <fishhook\\/fishhook.h>/#import <React\\/fishhook.h>/' ./node_modules/react-native/Libraries/WebSocket/RCTReconnectingWebSocket.m"
}
Связанный PR: facebook/react-native # 18492.
Ответ 2
В Android я исправил эту ошибку, выполнив следующие действия:
Сначала вам нужно убедиться, что вы правильно настроили среду NDK: https://facebook.github.io/react-native/docs/building-from-source.html
Убедитесь, что ваша переменная окружения ANDROID_NDK path и ndk.dir=C\:\\Users\\jb\\android-ndk\\android-ndk-r10e
(local.properties) настроены правильно.
После этого в верхнем уровне Gradle вашего проекта добавьте эту строку, где вы ссылаетесь на свое местоположение проекта React Native:
allprojects {
repositories {
buildDir = "G:\\ReactNativ\\MyReactNativeProjectApp\\etc.."
mavenLocal()
jcenter()
}
}
Удалите свои папки сборки в папках Android, затем выполните чистую сборку.
Ответ 3
Проблема втянута в ограничение MAX_PATH Windows.
В Windows API... максимальная длина для пути - MAX_PATH, которая определена как 260 символов.
Это происходит из-за недавних изменений, которые строят йогу как модуль, а не просто включают ее в качестве библиотеки. При создании модуля инструментарий NDK преобразует относительный путь источника модуля в абсолютный путь и добавляет его в проект buildDir
чтобы сборка могла быть абсолютно и однозначно идентифицирована.
Когда ваш проект создает ReactAndroid, buildDir
- это C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\
, а относительный путь к источнику yogacore
из projectRoot
../ReactCommon/yoga/yoga/
.
Добавьте все это с некоторой контекстной информацией о сборке (..\tmp\buildReactNdkLib\local\armeabi-v7a\..
), и вы получите пути, которые вы видите выше, из относительно общего пути проекта (c:\Users\[username]\OneDrive\[projectName]
). Длина пути 437 символов для YGNodePrint.od
.
Как мы это исправим? Ну, ваша первая мысль может заключаться в том, что у вас есть обновление для Windows 10 Anniversary Update, и вы должны просто включить LongPathSupport
В редакторе реестра используйте левую боковую панель, чтобы перейти к следующему ключу:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
[и установите значение LongPathsEnabled
равным 1
]
Это, безусловно, самое простое решение, но это абсолютно не сработает. Большинство инструментов в toolchain android-ndk-r10e
которые используются для использования на основе реакции, не могут правильно интерпретировать пути длиной более 260 символов. У меня нет достаточно густой бороды, чтобы понять иерархию инструментальной привязки перекрестного компилятора android, но, похоже, они понимают, что большинство инструментов не срабатывают в этом отношении даже в самых последних версиях, и исправление не похоже тривиальный.
SO - то, что я рекомендую, состоит в том, чтобы просто следовать указаниям на странице Building React Native from Source. Хотя они обеспокоены не стиранием кеша, мы обеспокоены сокращением пути сборки.
... вы можете изменить путь к ~/.gradle/init.gradle
файл ~/.gradle/init.gradle
:
gradle.projectsLoaded {
rootProject.allprojects {
buildDir = "/path/to/build/directory/${rootProject.name}/${project.name}"
}
}
Установите его на что-то короткое, и оно может работать. Если нет, вам нужно переместить путь kulaapp
ближе к корню.
-ИЛИ ЖЕ-
Если вы чувствуете себя особенно 133t сегодня, вы можете попытаться создать среду для react-native
отдельно, используя :ReactAndroid:installArchives
чтобы ваша сборка могла просто принести ваш блестящий новый артефакт реакции из mavenlocal()
. (Это было первое, что я пробовал. Это не тривиально и не рекомендуется. Никто из вашей команды не понравится вам.)