Migra de Xcode a Bazel

Informar un problema Ver fuente . Por la noche · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

En esta página, se describe cómo compilar o probar un proyecto de Xcode con Bazel. Integra se describen las diferencias entre Xcode y Bazel, y se proporcionan los pasos para convertir un proyecto Xcode en uno de Bazel. También proporciona soluciones de solución de problemas para abordar errores comunes.

Diferencias entre Xcode y Bazel

  • Bazel requiere que especifiques explícitamente cada destino de compilación y su las dependencias y la configuración de compilación correspondiente a través de las reglas de compilación.

  • Bazel requiere todos los archivos de los que depende el proyecto que estén presentes. dentro del directorio del espacio de trabajo o se especifican como importaciones en el archivo WORKSPACE .

  • Cuando compilas proyectos de Xcode con Bazel, los archivos BUILD se convierten en fuente de información. Si trabajas en el proyecto en Xcode, debes generar un versión nueva del proyecto Xcode que coincida con los archivos BUILD mediante Usa Tulsi cada vez que actualices los archivos BUILD. Si si no estás usando Xcode, los comandos bazel build y bazel test proporcionan capacidades de compilación y prueba con ciertas limitaciones, que se describen más adelante en este .

  • Debido a las diferencias en los esquemas de configuración de compilación, como los diseños de directorios o marcas de compilación, es posible que Xcode no sea del todo consciente del “panorama general” de los y, por lo tanto, es posible que algunas funciones de Xcode no funcionen. A saber:

    • Según los objetivos que selecciones para la conversión en Tulsi, Xcode podría no podrá indexar correctamente la fuente del proyecto. Esto afecta el código la finalización y la navegación en Xcode, ya que Xcode no puede ver todos del código fuente del proyecto.

    • Es posible que el análisis estático, los desinfectantes de direcciones y los desinfectantes para subprocesos no funcionen ya que Bazel no produce los resultados que Xcode espera con esas funciones.

    • Si generas un proyecto de Xcode con Tulsi y lo usas para ejecutar desde Xcode, Xcode ejecutará las pruebas en lugar de Bazel Para ejecutar pruebas con Bazel, ejecuta el comando bazel test de forma manual.

Antes de comenzar

Antes de comenzar, haz lo siguiente:

  1. Instala Bazel si aún no lo has hecho.

  2. Si no estás familiarizado con Bazel y sus conceptos, completa el instructivo de la app para iOS). Deberías comprender los conceptos de de Terraform, incluidos los archivos WORKSPACE y BUILD, así como el conceptos de destinos, reglas de compilación y paquetes de Bazel.

  3. Analizar y comprender las dependencias del proyecto.

Analizar las dependencias del proyecto

A diferencia de Xcode, Bazel requiere que declares explícitamente todas las dependencias para para cada destino del archivo BUILD.

Para obtener más información sobre dependencias externas, consulta Trabaja 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:

  1. Crea el archivo WORKSPACE

  2. (Experimental) Integra dependencias de CocoaPods

  3. Crea un archivo BUILD:

    a. Agrega el destino de la aplicación

    b. Agrega los objetivos de prueba (opcional)

    c. Agrega los destinos de la biblioteca

  4. (Opcional) Cómo usar la compilación en detalle

  5. Ejecuta la compilación

  6. Genera el proyecto Xcode con Tulsi

Paso 1: Crea el archivo WORKSPACE

Crea un archivo WORKSPACE en un directorio nuevo. Este directorio se convierte en el archivo raíz del espacio de trabajo. Si el proyecto no usa dependencias externas, este archivo se puede vacío. Si el proyecto depende de archivos o paquetes que no se encuentran en uno de los directorios del proyecto, especifica estas dependencias externas en el archivo WORKSPACE .

Paso 2: Integra las dependencias de CocoaPods (experimental)

Para integrar dependencias de CocoaPods en el espacio de trabajo de Bazel, debes convertir en paquetes de Bazel, como se describe en Cómo convertir dependencias de CocoaPods.

Paso 3: Crea un archivo BUILD

Luego de definir el lugar de trabajo y las dependencias externas, debes Crea un archivo BUILD que le indique a Bazel cómo está estructurado el proyecto. Crea el archivo BUILD en la raíz del espacio de trabajo de Bazel y configurarlo para que realice una compilación inicial del proyecto de la siguiente manera:

Sugerencia: Para obtener más información sobre los paquetes y otros conceptos de Bazel, consulta Lugares de trabajo, paquetes y objetivos.

Paso 3a: Agrega el destino de la aplicación

Agrega un elemento macos_application. o un ios_application objetivo de la regla. Este destino compila un paquete de aplicación para macOS o iOS, respectivamente. En el destino, especifica como mínimo lo siguiente:

  • bundle_id: El ID del paquete (ruta de acceso DNS inversa seguida del nombre de la app) del binario.

  • provisioning_profile: perfil de aprovisionamiento de tu Apple Developer (si compilas para un dispositivo iOS).

  • families (solo para iOS): Indica si deseas compilar la aplicación para iPhone, iPad, o ambas.

  • infoplists: Es la lista de archivos .plist que se combinarán en el archivo Info.plist final.

  • minimum_os_version: Es la versión mínima de macOS o iOS que que admite la aplicación. Esto garantiza que Bazel compile la aplicación con el con los niveles de API correctos.

Paso 3b: Agrega los objetivos de prueba (opcional)

Compatibilidad con las reglas de compilación de Apple de Bazel ejecutando pruebas de unidades basadas en bibliotecas en iOS y macOS, así como en apps en macOS. Para pruebas basadas en aplicaciones en iOS o la IU en cualquiera , Bazel compilará los resultados de las pruebas, pero estas se deberán ejecutar en Xcode a través de un proyecto generado con Tulsi. Agrega los objetivos de prueba de la siguiente manera:

  • macos_unit_test para ejecutar pruebas de unidades basadas en bibliotecas y aplicaciones en un macOS

  • ios_unit_test para ejecutar pruebas de unidades basadas en bibliotecas en iOS. Para las pruebas que requieren la versión , Bazel compilará los resultados de las pruebas, pero no ejecutará las pruebas. Debes Genera un proyecto de Xcode con Tulsi y ejecuta las pruebas desde Xcode.

  • ios_ui_test para generar los resultados necesarios para ejecutar pruebas de interfaz de usuario en el simulador de iOS con Xcode. Debes generar un proyecto de Xcode con Tulsi y ejecuta las pruebas desde Xcode. Bazel no puede ejecutar pruebas de IU de forma nativa.

Como mínimo, especifica un valor para el atributo minimum_os_version. Mientras que otros atributos de empaquetado, como bundle_identifier y infoplists, de forma predeterminada con los valores más utilizados, asegúrate de que esos valores predeterminados sean compatibles con el proyecto y ajustarlos según sea necesario. Para las pruebas que requieren la versión simulador, también debes especificar el nombre de destino ios_application como el valor del test_host.

Paso 3c: Agrega las orientaciones de las bibliotecas

Agrega un elemento objc_library objetivo para cada biblioteca de Objective C y una swift_library Objetivo para cada biblioteca de Swift de la que dependan la aplicación o las pruebas.

Agrega los objetivos de la biblioteca de la siguiente manera:

  • Agrega los objetivos de la biblioteca de la aplicación como dependencias a la aplicación. objetivos.

  • Agrega los destinos de la biblioteca de pruebas como dependencias a los objetivos de prueba.

  • Enumera las fuentes de implementación en el atributo srcs.

  • Enumera los encabezados en el atributo hdrs.

Para obtener más información sobre las reglas de compilación, consulta Reglas de Apple para Bazel.

En este punto, se recomienda probar la compilación:

bazel build //:<application_target>

Paso 4: Obtén información detallada de la compilación (opcional)

Si el proyecto es grande, o a medida que crece, considera dividirlo en varios Paquetes de Bazel Este mayor nivel de detalle proporciona lo siguiente:

  • Mayor incrementalidad de las compilaciones

  • Mayor paralelización de tareas de compilación

  • Mejor capacidad de mantenimiento para futuros usuarios,

  • Mejor control de la visibilidad del código fuente en los objetivos y paquetes Esta Evita problemas, como las bibliotecas que contienen la filtración de detalles de la implementación. en APIs públicas.

Consejos para detallar el proyecto:

  • Coloca cada biblioteca en su propio paquete de Bazel. Comienza con los que requieren el la menor cantidad de dependencias y avanzar en el árbol de dependencias.

  • A medida que agregues archivos BUILD y especifiques destinos, agrega estos destinos nuevos al deps atributos de los destinos que dependen de ellos.

  • La función glob() no cruza los límites de paquetes, por lo que, de paquetes aumenta, los archivos que coinciden con glob() se reducirán.

  • Cuando agregues un archivo BUILD a un directorio main, agrega también un archivo BUILD a el directorio test correspondiente.

  • Aplica límites de visibilidad de buen estado en todos los paquetes.

  • Compila el proyecto después de cada cambio importante en los archivos BUILD y corrígelo 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 prueba el destino de manera individual para encontrar fuentes con mayor facilidad de cualquier error que ocurra.

Por ejemplo:

bazel build //:my-target

Paso 6: Genera el proyecto de Xcode con Tulsi

Cuando compilas con Bazel, los archivos WORKSPACE y BUILD se convierten en la fuente sobre la compilación. Para que Xcode tenga en cuenta esto, debes generar un Proyecto de Xcode compatible con Bazel mediante Tulsi.

Soluciona problemas

Pueden surgir errores de Bazel cuando no se sincroniza con la versión de Xcode seleccionada. como cuando aplicas una actualización. Aquí hay algunas cosas que puedes probar si estás 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 Xcode Select 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.