webentwicklung-frage-antwort-db.com.de

Xcode 10: DB-Fehler kann nicht hinzugefügt werden

Bei der Aktualisierung auf Xcode 10 kann das statische iOS-Bibliotheksziel nicht erstellt werden. So versuche ich es zu bauen:

xcodebuild -target TargetName -configuration Release clean build

Mit Xcode 9 läuft alles reibungslos, aber wenn Xcode 10 für Build verwendet wird, erhalte ich folgende Fehlermeldung (after clean läuft reibungslos):

hinweis: Verwenden Sie ein neues Buildsystem

hinweis: Planungsaufbau

anmerkung: Buildbeschreibung erstellen Fehler bei der Erstellung von Systeminformationen: DB kann nicht angefügt werden: Fehler: Zugriff auf Build-Datenbank "/Users/uerceg/random-path/build/XCBuildData/build.db": Die Datenbank ist locked Möglicherweise laufen gleichzeitig zwei Builds gleichzeitig Speicherort des Dateisystems.

** BUILD FAILED **

** BUILD FAILED **

Die folgenden Buildbefehle sind fehlgeschlagen: PhaseScriptExecution MultiPlatform\Build /Users/uerceg/random-path/build/Library.build/Release-iphoneos/LibraryTarget.build/Script-9DE7C9021AE68FA5001556E5.sh (1 Fehler)

Dies ist wahrscheinlich nicht verwandt, aber ich habe festgestellt, dass das neue Xcode 10-Buildsystem doppelte Copy Bundle Resource Info.plist-Dateien als Fehler kennzeichnet. Daher habe ich sichergestellt, dass keine doppelten Einträge vorhanden sind. Wahrscheinlich hängt dieser Fehler jedoch nicht mit dieser Tatsache zusammen.

Hat jemand eine Idee, was falsch sein könnte?

22
uerceg

Okay, es scheint, als hätte ich es gelöst. Ich hatte /bin/sh-Skript in Build Phases, das versuchte, eine fette statische Bibliothek zu erstellen. Im Skript hatte ich OBJROOT path so eingestellt:

OBJROOT="${OBJROOT}"

Es scheint, als hätten Xcode 10 und das neue Build-System einige Pfade geändert, und diese Zeile war die Ursache des Problems. Es muss angepasst werden an:

OBJROOT="${OBJROOT}/DependentBuilds"

Danach kann xcodebuild dieses Ziel ohne Probleme mit dem in Xcode 10 eingeführten neuen Build-System erstellen.

Ich bin nicht zu dieser Lösung gekommen, ein großes Dankeschön an Matt Gallagher und seinen Beitrag hier: https://github.com/mattgallagher/CwlSignal/issues/24#issuecomment-396931001


Wie von @TMin im Kommentar gefordert, sieht mein Skript folgendermaßen aus:

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"

Problem ist in der build_static_library-Methode in dieser Zeile:

OBJROOT="${OBJROOT}" \

Ändern Sie diese Zeile in:

OBJROOT="${OBJROOT}/DependantBuilds" \

löst das Problem für mich.

42
uerceg

XCode-Datei öffnen -> Projekteinstellungen

Build System-> Legacy Build System

Konfigurieren Sie XCode von Projekteinstellungen der Version 10.0, um das Problem zu lösen.

27
sharon ouyang

Wenn Sie das Build-Skript zum Erstellen von Bibliotheken für Submodule wie mich verwenden, müssen Sie das neue Build-System in Ihrem Build-Skript explizit deaktivieren, indem Sie -UseModernBuildSystem=NO in Ihrem Befehl xcodebuild verwenden.

Zum Beispiel:

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
15
Shih Ken

Wenn Sie das Standard-Buildsystem von XCode 10 beibehalten möchten, das Build jedoch außerhalb von IDE (z. B. in einer CI-Maschine) ausgeführt wird, ersetzen Sie einfach den Parameter -target für den Parameter -scheme in Ihrem Befehl xcodebuild wie folgt:

xcodebuild -scheme SchemeName -configuration Release clean build

Danke an this post von 2015, das von einem sehr ähnlichen Problem spricht und mir den Hinweis gab, dieses Problem zu lösen. Wie derselbe Autor sagt: 

Ich würde vermuten, dass xcodebuild ohne Schema geht falsch durch das "moderne Build-System", wobei der erwähnte Fehler angezeigt wird

0
Delfín

Verwenden Sie dieses Skript, wird es gut mit dem neuen Build-System funktionieren 

# 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

bevor das Xcode 10-Buildsystem einen einzelnen Thread verwendet, verwendet es in Xcode 10 ein neues Buildsystem mit mehreren Threads. Bei jedem Ausführen der Build-Xcode-Schaltfläche "Ausführen" wird dieses Skript verwendet 

 xcodebuild -target logger ONLY_ACTIVE_Arch=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}".

ruft noch einmal für build so weiter auf, dass RECURSION erstellt wird

Vergessen Sie nicht, Ihr Skript mit (fi) dem Ende der IF-Bedingung zu beenden 

Schritt 1 besteht darin, RECURSION zu erkennen und zu stoppen 

0
Raj Maurya

Ich habe die gleichen Probleme und versuche alles aus den Hinweisen, aber dieser Fehler besteht weiterhin. Manchmal wird das Projekt erstellt, und beim nächsten Mal gibt es keinen Fehler. Die Lösung, die mir dabei hilft, besteht darin, das Schema zu bearbeiten und Parallelize Build auszuschalten. Danach funktioniert alles gut.

0
Dmytro Turkov

Das Hinzufügen eines Schritts "Abgeleitete Daten bereinigen" in meinen Build-Skripten (vor einem Xcode-Build) scheint das Problem für mich zu beheben.

Ich bin nicht sicher, ob es damit zusammenhängt, aber mein Projekt verwendet Realm (installiert mit CocoaPods). Dies ist das GitHub-Problem, das zu "Fix" -> https://github.com/realm/realm-cocoa/issues/5812 geführt hat.

0
Adam Waite