web-dev-qa-db-fra.com

Xcode 10: impossible d'attacher l'erreur de base de données

Lors de la mise à jour vers Xcode 10, la génération cible de bibliothèque statique iOS ne parvient pas. Voici comment j'essaie de le construire:

xcodebuild -target TargetName -configuration Release clean build

Avec Xcode 9, tout se passe bien, mais lorsque Xcode 10 est utilisé pour la construction, le message d'erreur suivant s'affiche (après le nettoyage en douceur):

note: Utilisation du nouveau système de compilation

note: construction de planification

note Remarque: Construire la description de la construction Construire erreur d'information: impossible d'attacher la base de données: erreur: accès à la base de données de construction "/Users/uerceg/random-path/build/XCBuildData/build.db": la base de données est verrouillée Il est possible que deux versions simultanées s'exécutent dans le même fichier emplacement du système de fichiers.

** ÉCHEC DE CONSTRUCTION **

** ÉCHEC DE CONSTRUCTION **

Les commandes de construction suivantes ont échoué: PhaseScriptExecution MultiPlatform\Build /Users/uerceg/random-path/build/Library.build/Release-iphoneos/LibraryTarget.build/Script-9DE7C9021AE68FA5001556E5.sh (1 échec)

Ceci n’a probablement aucun rapport, mais j’ai remarqué que les nouvelles versions du système de construction Xcode 10 marquaient les erreurs comme des erreurs dans les fichiers Copy Bundle Resource Info.plist.

Est-ce que quelqu'un a une idée de ce qui pourrait être faux?

22
uerceg

Ok, semble avoir réussi à le résoudre. J'avais /bin/sh script dans Build Phases qui essayait de construire une grosse bibliothèque statique. Dans le script, j'avais OBJROOT chemin défini comme ceci:

OBJROOT="${OBJROOT}"

On dirait que Xcode 10 et le nouveau système de construction ont modifié certains chemins sur le chemin et cette ligne était la source du problème. Il doit être ajusté pour:

OBJROOT="${OBJROOT}/DependentBuilds"

Après cela, xcodebuild parvient à construire cette cible sans problèmes avec le nouveau système de construction introduit dans Xcode 10.

Je ne suis pas arrivé à cette solution par moi-même, un grand merci à Matt Gallagher et son message ici: https://github.com/mattgallagher/CwlSignal/issues/24#issuecomment-396931001


Comme demandé par @TMin dans le commentaire, voici à quoi ressemble mon script:

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"

Le problème est dans la méthode build_static_library dans cette ligne:

OBJROOT="${OBJROOT}" \

Changer cette ligne pour:

OBJROOT="${OBJROOT}/DependantBuilds" \

résout le problème pour moi.

42
uerceg

Ouvrir le fichier XCode-> Paramètres du projet

Système de construction-> Système de construction hérité

Configurer XCode de la version 10.0 Les paramètres du projet peuvent résoudre le problème.

27
sharon ouyang

Si vous utilisez un script de construction pour construire les bibliothèques de sous-module comme moi, vous devez également désactiver explicitement le nouveau système de construction dans votre script de construction à l'aide de -UseModernBuildSystem=NO dans votre commande xcodebuild.

Par exemple:

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

Si vous souhaitez conserver le système de génération par défaut XCode 10 tout en l'exécutant en dehors de IDE (sur une machine CI, par exemple), remplacez simplement le paramètre -target par le paramètre -scheme dans votre commande xcodebuild, comme suit:

xcodebuild -scheme SchemeName -configuration Release clean build

Merci à this post de 2015 qui parle d’un problème très similaire et qui m’a donné l’allusion de le résoudre. Comme dit le même auteur, 

Je me risquerais à deviner, que xcodebuild sans plan va à tort par le "système de construction moderne", donnant l'erreur mentionnée

0
Delfín

Utilisez ce script, il fonctionnera correctement avec le nouveau système de construction 

# 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

avant que Xcode 10 build système utilise un seul thread, mais dans Xcode 10, il utilise un nouveau système de construction avec plusieurs threads. Ainsi, à chaque fois que vous exécutez votre bouton Xcode Run, ce script 

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

appellera une fois de plus pour construire ainsi de suite, cela créera RECURSION

N'oubliez pas de terminer votre script avec (fi) sa fin de condition IF 

L'étape 1 consiste à détecter la récurrence et à les arrêter 

0
Raj Maurya

J'ai les mêmes problèmes et essaie tout ce qui est indiqué, mais cette erreur persiste. Parfois, le projet est construit, la prochaine fois, il n'y a pas d'erreur. Et la solution qui m’aide est de modifier le schéma et de désactiver Parallelize Build. Après que tout fonctionne bien.

0
Dmytro Turkov