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.

ШАГ 1:- Выберите настройки проекта введите описание изображения здесь

ШАГ 2:- Изменить систему сборки:-"Устаревшая система сборки". введите описание изображения здесь

ШАГ 3:- Очисти и собери проект, он у меня сработал!!:)

Если вы хотите сохранить систему сборки 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.dbfile вместе с его дочерними файлами и каталогами. Это может показаться мелочью, но у меня это сработало.

Я публикую это повторно, потому что модератор счел целесообразным удалить мой предыдущий ответ.

Я столкнулся с теми же проблемами при обновлении сборками до новой системы сборки из-за требований xcframeworks.

Ошибка: «..... Build / Intermediates.noindex / XCBuildData / build.db»: база данных заблокирована. Возможно, в одном месте файловой системы работают две параллельные сборки ».

Сборка ранее работала нормально при запуске с

Ни один из приведенных выше / утвержденных ответов не помог мне.

Что сработало для меня, так это переход от к в моем сценарии Fastlane.

Надеюсь, этот ответ поможет кому-то в будущем.

Это может быть связано с тем, что в вашем подфайле есть несовместимая версия, чтобы убедиться, что вы открываете runner.xcodeproj с помощью xcode и смотрите версию, а затем идете и смотрите подфайл, чтобы убедиться, что он тот же и раскомментирован, если не сделать их одинаковыми. надеюсь, что это полезно.

Другие вопросы по тегам