En esta página, se describe cómo compilar o probar un proyecto de Xcode con Bazel. Se describen las diferencias entre Xcode y Bazel, y se proporcionan los pasos para convertir un proyecto de Xcode en un proyecto de Bazel. También proporciona soluciones de solución de problemas para abordar errores comunes.
Diferencias entre Xcode y Bazel
Bazel requiere que especifiques de forma explícita cada destino de compilación y sus dependencias, además de la configuración de compilación correspondiente mediante reglas de compilación.
Bazel requiere que todos los archivos de los que depende el proyecto estén presentes en el directorio del lugar de trabajo o se especifiquen como importaciones en el archivo
WORKSPACE
.Cuando compilas proyectos de Xcode con Bazel, los archivos
BUILD
se convierten en la fuente de información. Si trabajas en el proyecto en Xcode, debes generar una versión nueva del proyecto que coincida con los archivosBUILD
mediante rules_xcodeproj cada vez que actualices los archivosBUILD
. Algunos cambios en los archivosBUILD
, como agregar dependencias a un destino, no requieren volver a generar el proyecto, lo que puede acelerar el desarrollo. Si no usas Xcode, los comandosbazel build
ybazel test
proporcionan capacidades de compilación y prueba con ciertas limitaciones que se describen más adelante en esta guía.
Antes de comenzar
Antes de comenzar, haz lo siguiente:
Instala Bazel si aún no lo hiciste.
Si no estás familiarizado con Bazel y sus conceptos, completa el instructivo de la app para iOS. Debes comprender el lugar de trabajo de Bazel, incluidos los archivos
WORKSPACE
yBUILD
, así como los conceptos de destinos, reglas de compilación y paquetes de Bazel.Analizar y comprender las dependencias del proyecto.
Analizar las dependencias del proyecto
A diferencia de Xcode, Bazel requiere que declares de forma explícita todas las dependencias para
cada destino en el archivo BUILD
.
Para obtener más información sobre las dependencias externas, consulta Cómo trabajar con dependencias externas.
Compila o prueba un proyecto de Xcode con Bazel
Para compilar o probar un proyecto de Xcode con Bazel, haz lo siguiente:
Paso 1: Crea el archivo WORKSPACE
Crea un archivo WORKSPACE
en un directorio nuevo. Este directorio se convierte en la raíz del lugar de trabajo
de Bazel. Si el proyecto no usa dependencias externas, este archivo puede estar vacío. Si el proyecto depende de archivos o paquetes que no están en uno de los directorios del proyecto, especifica estas dependencias externas en el archivo WORKSPACE
.
Paso 2: Integra dependencias de SwiftPM (experimental)
Para integrar dependencias de SwiftPM en el lugar de trabajo de Bazel con swift_bazel, debes convertirlas en paquetes de Bazel como se describe en el siguiente instructivo.
Paso 3: Crea un archivo BUILD
Una vez que hayas definido el lugar de trabajo y las dependencias externas, debes
crear un archivo BUILD
que le indique a Bazel cómo se estructura el proyecto. Crea
el archivo BUILD
en la raíz del lugar de trabajo de Bazel y configúralo para realizar una
compilación inicial del proyecto de la siguiente manera:
- Paso 3a: Agrega el destino de la aplicación
- Paso 3b: Agrega los destinos de prueba (opcional)
- Paso 3c: Agrega las segmentaciones de la biblioteca
Sugerencia: Para obtener más información sobre los paquetes y otros conceptos de Bazel, consulta Lugares de trabajo, paquetes y destinos.
Paso 3a: Agrega el destino de la aplicación
Agrega un objetivo de regla macos_application
o ios_application
. Este destino compila un paquete de aplicaciones de macOS o iOS, respectivamente.
En el destino, especifica lo siguiente como mínimo:
bundle_id
: Es el ID del paquete (ruta de DNS inversa seguida del nombre de la app) del objeto binario.provisioning_profile
: Es el perfil de aprovisionamiento de tu cuenta de desarrollador de Apple (si compilas para un dispositivo iOS).families
(solo para iOS): Indica si se debe compilar la aplicación para iPhone, iPad o ambos.infoplists
: Lista de archivos .plist que se combinarán en el archivo final Info.plist.minimum_os_version
: Es la versión mínima de macOS o iOS que admite la aplicación. Esto garantiza que Bazel compile la aplicación con los niveles de API correctos.
Paso 3b: Agrega los objetivos de prueba (opcional)
Las reglas de compilación de Apple de Bazel admiten la ejecución de pruebas de IU y unidades en todas las plataformas de Apple. Agrega destinos de prueba de la siguiente manera:
macos_unit_test
para ejecutar pruebas de unidades basadas en bibliotecas y aplicaciones en macOSios_unit_test
para compilar y ejecutar pruebas de unidades basadas en bibliotecas en iOSios_ui_test
para compilar y ejecutar pruebas de la interfaz de usuario en el simulador de iOSExisten reglas de prueba similares para tvOS, watchOS y visionOS.
Como mínimo, especifica un valor para el atributo minimum_os_version
. Si bien otros atributos de empaquetado, como bundle_identifier
y infoplists
, usan de forma predeterminada los valores más usados, asegúrate de que esos valores predeterminados sean compatibles con el proyecto y ajústalos según sea necesario. Para las pruebas que requieren el simulador
de iOS, especifica también el nombre del destino ios_application
como el valor del
atributo test_host
.
Paso 3c: Agrega las orientaciones de la biblioteca
Agrega un objetivo objc_library
para cada biblioteca de Objective-C y un objetivo swift_library
para cada biblioteca de Swift de la que dependan la aplicación o las pruebas.
Agrega las orientaciones de la biblioteca de la siguiente manera:
Agrega los destinos de la biblioteca de la aplicación como dependencias de los destinos de la aplicación.
Agrega los destinos de la biblioteca de pruebas como dependencias de los destinos de prueba.
Enumera las fuentes de implementación en el atributo
srcs
.Muestra los encabezados en el atributo
hdrs
.
Puedes explorar ejemplos existentes para varios tipos de aplicaciones directamente en el directorio de ejemplos de rules_apple. Por ejemplo:
Si quieres obtener más información sobre las reglas de compilación, consulta Reglas de Apple para Bazel.
En este punto, te recomendamos probar la compilación:
bazel build //:<application_target>
Paso 4: Brinda detalles de la compilación (opcional)
Si el proyecto es grande o a medida que crece, considera dividirlo en varios paquetes de Bazel. Este nivel de detalle mayor proporciona lo siguiente:
Mayor incrementalidad de las compilaciones
Mayor paralelización de tareas de compilación
Mejor mantenimiento para futuros usuarios,
Se mejoró el control de la visibilidad del código fuente entre destinos y paquetes. De esta manera, se evita que las bibliotecas que contienen detalles de implementación se filtren a las APIs públicas.
Consejos para granular el proyecto:
Coloca cada biblioteca en su propio paquete de Bazel. Comienza con las que requieran la menor cantidad de dependencias y avanza en el árbol de dependencias.
A medida que agregues archivos
BUILD
y especifiques destinos, agrega estos destinos nuevos a los atributosdeps
de los destinos que dependen de ellos.La función
glob()
no cruza los límites del paquete, por lo que, a medida que aumente la cantidad de paquetes, se reducirán los archivos que coincidan conglob()
.Cuando agregues un archivo
BUILD
a un directoriomain
, también agrega un archivoBUILD
al directoriotest
correspondiente.Aplica límites de visibilidad en buen estado en todos los paquetes.
Compila el proyecto después de cada cambio importante en los archivos
BUILD
y corrige los errores de compilación a medida que los encuentres.
Paso 5: Ejecuta la compilación
Ejecuta la compilación completamente migrada para asegurarte de que se complete sin errores ni advertencias. Ejecuta cada aplicación y destino de prueba de forma individual para encontrar con mayor facilidad las fuentes de cualquier error que se produzca.
Por ejemplo:
bazel build //:my-target
Paso 6: Genera el proyecto de Xcode con rules_xcodeproj
Cuando compilas con Bazel, los archivos WORKSPACE
y BUILD
se convierten en la fuente
de confianza sobre la compilación. Para que Xcode esté al tanto de esto, debes generar un
proyecto de Xcode compatible con Bazel mediante rules_xcodeproj.
Solución de problemas
Pueden surgir errores de Bazel cuando se desincroniza con la versión de Xcode seleccionada, como cuando aplicas una actualización. Estos son algunos pasos que puedes probar si experimentas errores con Xcode. Por ejemplo, “se debe especificar la versión de Xcode para usar una CROSSTOOL de Apple”.
Ejecuta Xcode manualmente y acepta los Términos y Condiciones.
Usa la selección de Xcode para indicar la versión correcta, aceptar la licencia y borrar el estado de Bazel.
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -license
bazel sync --configure
- Si esto no funciona, también puedes intentar ejecutar
bazel clean --expunge
.