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.
Abrir archivo XCode-> Configuración del proyecto
Sistema de compilación-> Sistema de compilación heredado
Configurar XCode de la configuración del proyecto de la versión 10.0 puede resolver el problema.