new ios xcodebuild xcode10

ios - new - Xcode 10: no se puede adjuntar error de base de datos



xcode download (6)

Al actualizar a Xcode 10, la biblioteca estática de iOS no se puede construir. La forma en que estoy tratando de construirlo es la siguiente:

xcodebuild -target TargetName -configuration Release clean build

Con Xcode 9 todo funciona sin problemas, pero cuando Xcode 10 se usa para compilación, recibo el siguiente error (después de que Clean se ejecuta sin problemas):

nota: usando el nuevo sistema de compilación

nota: planificación de la construcción

nota: construyendo descripción de compilación Error de información del sistema de compilación: no se puede adjuntar DB: error: accediendo a la base de datos de compilación "/Users/uerceg/random-path/build/XCBuildData/build.db": la base de datos está bloqueada Posiblemente haya dos compilaciones simultáneas ejecutándose La misma ubicación del sistema de archivos.

** CONSTRUCCIÓN FALLIDA **

** CONSTRUCCIÓN FALLIDA **

Los siguientes comandos de compilación fallaron: PhaseScriptExecution MultiPlatform / Build /Users/uerceg/random-path/build/Library.build/Release-iphoneos/LibraryTarget.build/Script-9DE7C9021AE68FA5001556E5.sh (1 error)

Probablemente no esté relacionado, pero me di cuenta de que el nuevo sistema de compilación Xcode 10 marca los archivos duplicados Copy.plist Copy Bundle Resource Info.plist, por lo que me aseguré de que no haya entradas duplicadas, pero probablemente este error no esté relacionado con este hecho.

¿Alguien tiene alguna idea de lo que podría estar mal?


Está bien, parece que me las arreglé para resolverlo. Estaba teniendo el script /bin/sh en las Build Phases que intentaba crear una biblioteca estática grande. En el script, tuve OBJROOT ruta OBJROOT configurada así:

OBJROOT="${OBJROOT}"

Parece que Xcode 10 y el nuevo sistema de compilación cambiaron algunos caminos en el camino y esta línea fue la fuente del problema. Necesita ajustarse a:

OBJROOT="${OBJROOT}/DependentBuilds"

Después de eso, xcodebuild arregla para construir este objetivo sin problemas con el nuevo sistema de compilación introducido en Xcode 10.

No llegué a esta solución por mi cuenta, muchas gracias a Matt Gallagher y su publicación aquí: https://github.com/mattgallagher/CwlSignal/issues/24#issuecomment-396931001

Según lo solicitado por @TMin en el comentario, he aquí cómo se ve mi 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"

El problema está en el método build_static_library en esta línea:

OBJROOT="${OBJROOT}" /

Cambiando esa línea a:

OBJROOT="${OBJROOT}/DependantBuilds" /

resuelve el problema para mi


Si desea mantener el sistema de compilación predeterminado de XCode 10 pero aún ejecutando su compilación fuera del IDE (en una máquina CI, por ejemplo), simplemente reemplace su parámetro -scheme para el parámetro -scheme en su comando xcodebuild como:

xcodebuild -scheme SchemeName -configuration Release clean build

Gracias a this post de 2015 que habla de un problema muy similar y me dio la pista para resolver este problema. Como dice el mismo autor,

Me atrevería a suponer, que xcodebuild sin un esquema pasa por el "sistema de construcción moderno", dando el error mencionado


Si usas el script de compilación para construir las bibliotecas de submódulos como yo. También debe deshabilitar el nuevo sistema de compilación en su secuencia de comandos de compilación explícitamente mediante el uso de -UseModernBuildSystem=NO en su comando xcodebuild.

Por ejemplo:

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


Tengo los mismos problemas y trato de todo desde las sugerencias, pero este error continúa. A veces el proyecto se construye, la próxima vez no hay un error. Y la solución que me ayuda es editar el esquema y desactivar Parallelize Build. Después de eso todo funciona bien.


Utilice este script si funciona bien con el nuevo sistema de compilación

# 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

Antes de que Xcode 10, el sistema de compilación utilice un único subproceso, pero en Xcode 10 utiliza un nuevo sistema de compilación con varios subprocesos, por lo que cada vez que ejecuta su compilación, Xcode ejecuta este script.

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

llamará una vez más para construir así sucesivamente, que creará RECURSIÓN

No se olvide de finalizar su secuencia de comandos con (fi) su fin de condición IF

El paso 1 es detectar la RECURSIÓN y detenerlos.