Xcode 10: невозможно прикрепить ошибку БД
При обновлении до Xcode 10 не удается создать целевой объект статической библиотеки iOS. Способ, которым я пытаюсь построить это, следующий:
xcodebuild -target TargetName -configuration Release clean build
С Xcode 9 все работает гладко, но когда Xcode 10 используется для сборки, я получаю следующую ошибку (после того, как чистая работа проходит гладко):
примечание: использование новой системы сборки
Примечание: Планирование сборки
примечание: создание описания сборки. Ошибка информации о системе сборки: невозможно подключить БД: ошибка: доступ к базе данных сборки "/Users/uerceg/random-path/build/XCBuildData/build.db": база данных заблокирована. Возможно, в системе одновременно выполняются две сборки то же расположение файловой системы.
** СТРОИТЬ НЕ УДАЧИ **
** СТРОИТЬ НЕ УДАЧИ **
Сбой следующих команд сборки: PhaseScriptExecution MultiPlatform\ Build /Users/uerceg/random-path/build/Library.build/Release-iphoneos/LibraryTarget.build/Script-9DE7C9021AE68FA5001556E5.sh (1 сбой)
Это, вероятно, не связано, но я заметил, что новые флаги системы сборки Xcode 10 дублированы Copy Bundle Resource
Файлы Info.plist считаются ошибками, поэтому я позаботился о том, чтобы не было дублированных записей, но, вероятно, эта ошибка не связана с этим фактом.
У кого-нибудь есть идеи, что может быть не так?
14 ответов
Хорошо, похоже, мне удалось решить это. я имел /bin/sh
сценарий в Build Phases
что пытался построить толстую статическую библиотеку. В сценарии у меня было OBJROOT
путь установлен так:
OBJROOT="${OBJROOT}"
Похоже, Xcode 10 и новая система сборки изменили некоторые пути на пути, и эта строка была источником проблемы. Это должно быть приспособлено к:
OBJROOT="${OBJROOT}/DependentBuilds"
После этого, xcodebuild
удается построить эту цель без проблем с новой системой сборки, представленной в Xcode 10.
Я сам не дошел до этого решения, большое спасибо Мэтту Галлахеру и его посту здесь: https://github.com/mattgallagher/CwlSignal/issues/24
По просьбе @TMin в комментарии, вот как выглядит мой скрипт:
set -e
# If we're already inside this script then die
if [ -n "$RW_MULTIPLATFORM_BUILD_IN_PROGRESS" ]; then
exit 0
fi
export RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1
RW_FRAMEWORK_NAME=${PROJECT_NAME}
RW_INPUT_STATIC_LIB="lib${PROJECT_NAME}.a"
RW_FRAMEWORK_LOCATION="${BUILT_PRODUCTS_DIR}/static/${RW_FRAMEWORK_NAME}Sdk.framework"
function build_static_library {
echo "1"
echo "${BUILD_DIR}"
# Will rebuild the static library as specified
# build_static_library sdk
xcrun xcodebuild -project "${PROJECT_FILE_PATH}" \
-target "${TARGET_NAME}" \
-configuration "${CONFIGURATION}" \
-sdk "${1}" \
ONLY_ACTIVE_ARCH=NO \
BUILD_DIR="${BUILD_DIR}" \
OBJROOT="${OBJROOT}" \
BUILD_ROOT="${BUILD_ROOT}" \
SYMROOT="${SYMROOT}" $ACTION
}
function make_fat_library {
# Will smash 2 static libs together
# make_fat_library in1 in2 out
xcrun lipo -create "${1}" "${2}" -output "${3}"
}
# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]; then
RW_SDK_PLATFORM=${BASH_REMATCH[1]}
else
echo "Could not find platform name from SDK_NAME: $SDK_NAME"
exit 1
fi
# 2 - Extract the version from the SDK
if [[ "$SDK_NAME" =~ ([0-9]+.*$) ]]; then
RW_SDK_VERSION=${BASH_REMATCH[1]}
else
echo "Could not find sdk version from SDK_NAME: $SDK_NAME"
exit 1
fi
# 3 - Determine the other platform
if [ "$RW_SDK_PLATFORM" == "iphoneos" ]; then
RW_OTHER_PLATFORM=iphonesimulator
else
RW_OTHER_PLATFORM=iphoneos
fi
# 4 - Find the build directory
if [[ "$BUILT_PRODUCTS_DIR" =~ (.*)$RW_SDK_PLATFORM$ ]]; then
RW_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}"
else
echo "Could not find other platform build directory."
exit 1
fi
# Build the other platform.
build_static_library "${RW_OTHER_PLATFORM}${RW_SDK_VERSION}"
# If we're currently building for iphonesimulator, then need to rebuild
# to ensure that we get both i386 and x86_64
if [ "$RW_SDK_PLATFORM" == "iphonesimulator" ]; then
build_static_library "${SDK_NAME}"
fi
# Join the 2 static libs into 1 and push into the .framework
make_fat_library "${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \
"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \
"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}Sdk"
# Ensure that the framework is present in both platform's build directories
cp -a "${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}Sdk" \
"${RW_OTHER_BUILT_PRODUCTS_DIR}/static/${RW_FRAMEWORK_NAME}Sdk.framework/Versions/A/${RW_FRAMEWORK_NAME}Sdk"
# Copy the framework to the project directory
ditto "${RW_FRAMEWORK_LOCATION}" "${SRCROOT}/Frameworks/static/${RW_FRAMEWORK_NAME}Sdk.framework"
Проблема в build_static_library
метод в этой строке:
OBJROOT="${OBJROOT}" \
Изменение этой строки на:
OBJROOT="${OBJROOT}/DependantBuilds" \
решает проблему для меня.
Откройте файл XCode-> Настройки проекта
Система сборки-> Старая система сборки
Настройте XCode версии 10.0, настройки проекта могут решить проблему.
Если вы используете скрипт для сборки библиотек субмодуля, как я. Вам также необходимо явно отключить новую систему сборки в вашем скрипте сборки, используя -UseModernBuildSystem=NO
в вашей команде xcodebuild.
Например:
xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}" -UseModernBuildSystem=NO
Удаление производных данных сработало для меня. Посмотрите, как вы можете это сделать: https://programmingwithswift.com/delete-derived-data-xcode/
У меня такие же проблемы и пробую все из подсказок, но эта ошибка все еще продолжается. Иногда проект строится, в следующий раз нет и ошибки. И решение, которое мне помогает, это отредактировать схему и отключить Parallelize Build. После этого все работает нормально.
Для меня я просто почистил свой проект. Перезапустил IDE и пересобрал проект, и все заработало как по маслу.
Добавление шага очистки производных данных в мои сценарии сборки (до сборки XCode), кажется, решает проблему для меня.
Не уверен, что это связано, но мой проект использует Realm (установлен с CocoaPods). Это проблема GitHub, которая вдохновила "исправить" -> https://github.com/realm/realm-cocoa/issues/5812.
Если вы хотите сохранить систему сборки XCode 10 по умолчанию, но по-прежнему запускать сборку вне среды IDE (например, на компьютере CI), просто замените -target
параметр для -scheme
параметр в вашем xcodebuild
команда как:
xcodebuild -scheme SchemeName -configuration Release clean build
Благодаря этому посту за 2015 год, в котором говорится об очень похожей проблеме, он дал мне подсказку, как решить эту проблему. Как говорит тот же автор,
Я бы рискнул догадаться, что
xcodebuild
без схемы идет неправильно через "современную систему сборки", выдавая упомянутую ошибку
Используйте этот скрипт, он будет работать нормально с новой системой сборки
# Step 1 search RECURSION and if detected stop "*/
if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: Detected, stopping"
else
export ALREADYINVOKED="true"
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
# Step 2. Build Device and Simulator versions
xcodebuild -target logger ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
xcodebuild -target logger-configuration ${CONFIGURATION} -sdk iphonesimulator -arch i386 -arch x86_64 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
# Step 3. Create universal binary file using lipo
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}universal.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"
# Last touch. copy the header files. Just for convenience
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"
fi
до того, как система сборки Xcode 10 использует один поток, но в Xcode 10 используется новая система сборки с несколькими потоками, поэтому каждый раз, когда вы запускаете сборку, запускайте кнопку запуска Xcode этот скрипт
xcodebuild -target logger ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}".
вызовем еще один раз для сборки так далее, что создаст RECURSION
Не забывайте заканчивать вас Script With (fi) своим концом условия IF
Шаг 1 - обнаружение рекурсии и остановка их
Я столкнулся с этой проблемой при запуске
swift run <your_proj>
.
Быстрого исправления можно добиться, удалив
build.db
file вместе с его дочерними файлами и каталогами. Это может показаться мелочью, но у меня это сработало.
Я публикую это повторно, потому что модератор счел целесообразным удалить мой предыдущий ответ.
Я столкнулся с теми же проблемами при обновлении сборками до новой системы сборки из-за требований xcframeworks.
Ошибка: «..... Build / Intermediates.noindex / XCBuildData / build.db»: база данных заблокирована. Возможно, в одном месте файловой системы работают две параллельные сборки ».
Сборка ранее работала нормально при запуске с
Ни один из приведенных выше / утвержденных ответов не помог мне.
Что сработало для меня, так это переход от
Надеюсь, этот ответ поможет кому-то в будущем.
Это может быть связано с тем, что в вашем подфайле есть несовместимая версия, чтобы убедиться, что вы открываете runner.xcodeproj с помощью xcode и смотрите версию, а затем идете и смотрите подфайл, чтобы убедиться, что он тот же и раскомментирован, если не сделать их одинаковыми. надеюсь, что это полезно.