Red de conocimiento informático - Material del sitio web - Cómo construir con bazel

Cómo construir con bazel

Instalación

Consulte: /ejemplo

$ cat > src/main/java/com/example/ProjectRunner.java <

paquete com. ejemplo;

Clase pública ProjectRunner {

Clase pública Saludo.>Clase pública ProjectRunner {

public static void main(String args[]) {

Saludo.sayHola();

}

}

}

}

EOF

$ cat & gt; src/main/java/com/example/Greeting.java <

paquete com.example;

saludo de clase pública {

public static void sayHola() {

System.out.println("¡Hola!");

}

}

}

EOF

Bazel analiza la información del proyecto que debe crearse a través de todos los archivos en el espacio de trabajo llamado BUILD, por lo que debemos instalarlo en ~ /gitroot/ my -Crea una BUILD en el directorio del proyecto para crear el archivo de compilación BUILD. El siguiente es el contenido del archivo generado BUILD:

# ~/gitroot/my-project/BUILD

java_binary(

name = "my-runner ",

srcs = glob(["**/*.java"]),

main_class = "com.example.ProjectRunner",

)

Los archivos BUILD utilizan una sintaxis similar a Python. Aunque no puede contener una sintaxis arbitraria de Python, cada regla de compilación en un archivo BUILD parece una llamada a una función de Python y se pueden agregar comentarios de una sola línea que comienzan con "#".

java_binary es una regla de compilación. El nombre corresponde al identificador del objetivo de compilación y se puede utilizar para especificar a Bazel el proyecto a compilar. srcs corresponde a la lista de archivos fuente que Bazel necesita para compilar en binarios. donde glob(["**/*.java"]) significa incluir recursivamente archivos con una extensión .java en cada subdirectorio. com.example.ProjectRunner especifica la clase que contiene el método principal.

Ahora puedes construir tu programa Java usando el siguiente comando:

$ cd ~/gitroot/my-project

$ bazel build //:my- corredor

INFO: 1 objetivo encontrado....

Objetivo //:mi-corredor actualizado:

bazel-bin/my- runner.jar

bazel-bin/my-runner

INFO: Tiempo necesario: 1,021 s, ruta crítica: 0,83 s.

Ruta crítica: 0,83 s

$ bazel-bin/my-runner

¡Hola!

¡Felicitaciones, ha creado con éxito su primer proyecto Bazel!

Agregar dependencias

Crear una sola regla no es un problema para proyectos pequeños, pero a medida que el proyecto crece en tamaño, necesitarás construir diferentes partes del proyecto por separado y luego combinarlas eventualmente. ellos ensamblados en un producto. Este enfoque evita tener que reconstruir toda la aplicación debido a pequeños cambios locales, y se pueden realizar diferentes pasos de compilación simultáneamente, mejorando así la eficiencia de la compilación.

Ahora, dividimos un proyecto en dos partes, construimos cada una de forma independiente y establecemos dependencias entre ellas. Según el ejemplo anterior, reescribimos el archivo de compilación BUILD:

java_binary(

name = "my-other-runner",

srcs = [" src/main/java/com/example/ProjectRunner.java "],

main_class = "com.example.ProjectRunner",

deps = [":greeter"],

)

java_library(

nombre = "saludador",

srcs = ["src/main/java/com/example/ Greeting.java"],

)

Aunque los archivos fuente son los mismos, Bazel ahora los compilará de manera diferente: primero compilará la biblioteca greeter y luego compilará my-other-runner. Una vez que la compilación sea exitosa, puedes ejecutar inmediatamente //:my-other-runner:

$ bazel run //:my-other-runner

INFO: 1 objetivo encontrado. ..

Target //:mi-otro-corredor actualizado:

bazel-bin/mi-otro-corredor.jar

bazel -bin/my-other-runner

INFO: Consumo de tiempo: 2,454 s, ruta crítica: 1,58 s

INFO: Ejecutar línea de comando: bazel-bin/my-other-runner corredor

¡Hola!

Ahora, si cambia el código ProjectRunner.java y reconstruye el destino my-other-runner, el archivo Greeting.java no se volverá a compilar porque nada ha cambiado.

Uso de varios paquetes de software

Para proyectos grandes, normalmente necesitamos dividirlos en varios directorios. Puede hacer referencia a destinos definidos en otros archivos BUILD utilizando nombres como //ruta/al/directorio:nombre-destino.

Supongamos que src/main/java/com/example/ tiene un subdirectorio cmdline/ que contiene los siguientes archivos:

$ mkdir -p src/main/java/com/example/cmdline

$ cat > src/main/java/ com/example/cmdline/Runner.java <

paquete com.example.cmdline;

importar com.example.Saludo ;

corredor de clase pública {

public static void main(String args[]) {

Saludo.sayHola();

}

}

EOF

Corredor. java depende de com.example Saludo, por lo que debemos agregar las reglas de dependencia correspondientes en el archivo de compilación src/main/java/com/example/cmdline/BUILD:

# ~/gitroot/my-project / src/main/java/com/example/ cmdline/BUILD

java_binary(

nombre = "corredor",

srcs = ["Runner.java " ],

main_class = "com.example.cmdline. p>

deps = ["//:greeter"]

)

Sin embargo, los objetivos de compilación son privados de forma predeterminada, lo que significa que solo se puede hacer referencia a nosotros dentro del mismo archivo BUILD. Esto evita exponer muchos detalles de implementación a la interfaz pública ***, pero también significa que debemos permitirlo manualmente. //: objetivo de bienvenida del que depende el corredor. El error encontrado al crear el objetivo del corredor es el siguiente:

$ bazel build //src/main/java/com/example/cmdline:runner p>

ERROR: /home/user/gitroot/my-project/src/main/java/com/example/cmdline/BUILD:2:1:

Destino '//: greeter' No visible en el objetivo '//src/main/java/com/example/cmdline.runner'

Si cree que la dependencia es legal, consulte la declaración de visibilidad del objetivo anterior: Análisis. '//src/main/java/com/example/cmdline:runner'.java/com/example/cmdline:runner' falló; compilación abortada: tiempo necesario: 0,091 s

Puedes hacer esto Agregue el atributo visibilidad = nivel al archivo BUILD para cambiar la declaración de visibilidad del objetivo.

Aquí se explica cómo cambiar la visibilidad del objetivo de bienvenida agregando una regla de visibilidad en el archivo ~/gitroot/my-project/BUILD:

java_library(

name = "greeter",

srcs = ["src/main/java/ com/example/Greeting.java"],

Visibilidad = ["//src/main/java/com/example / cmdline:__pkg__"],

)

Esta regla describe la visibilidad del destino //:greeter para el paquete //src/main/java/com/example/cmdline No impacto. Ahora podemos reconstruir el objetivo del corredor:

$ bazel run //src/main/java/com/example/cmdline:runner

INFO: 1 objetivo encontrado...< / p>

Destino //src/main/java/com/example/cmdline:runner actualizado:

bazel-bin/src/main/java/com/example/cmdline / runner.jar

bazel-bin/src/main/java/com/example/cmdline/runner

INFO: Tiempo necesario: 1,576 s, ruta crítica: 0,81 s

p>

INFO: Línea de comando en ejecución: bazel-bin/src/main/java/com/example/cmdline/runner

¡Hola!

La configuración de visibilidad se describe en la documentación.

Implementación

Si observa el contenido de bazel-bin/src/main/java/com/example/cmdline/runner.jar, puede ver que solo contiene Runner .class, Sin proteger Greeting.class depende de:

$ jar tf bazel-bin/src/main/java/com/example/cmdline/runner.jar

MED .jarexample /

com/example/cmdline/

com/example/cmdline/Runner.class

Esto solo se puede ejecutar localmente (porque el script de ejecución de Bazel tiene greeter jar en el classpath), pero si copio runner.jar por separado a otra máquina, no se ejecutará. Si desea crear un destino autónomo que contenga todas las dependencias y usarlo para implementar versiones, puede crear el destino runner_deploy.jar (similar a _deploy.jar, con el sufijo _deploy para un destino implementable) .

$ bazel build //src/main/java/com/example/cmdline:runner_deploy.jar

INFO: 1 objetivo encontrado...

Objetivo //src/main/java/com/example/cmdline:runner_deploy.jar actualizado:

bazel-bin/src/main/java/com/example/cmdline/ runner_deploy.jar

INFO: Tiempo necesario: 1,700 s, ruta crítica: 0,23 s

runner_deploy.jar contendrá todas las dependencias.

Próximos pasos

Ahora estás listo para crear tus objetivos y montar tu producto final. A continuación, consulte los tutoriales para aprender a utilizar Bazel para crear aplicaciones de servidor, Android e iOS. También puede consultar el manual de usuario para obtener más información. Si tiene preguntas, pregunte en el foro de discusión de Bazel.