Формирование ошибки йоги 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(). (Это было первое, что я пробовал. Это не тривиально и не рекомендуется. Никто из вашей команды не понравится вам.)