Bazel

2020. 11. 19. 18:25카테고리 없음

Build with Bazel

Java 기준 package 구성

root

|-BUILD

|-src

    |-main

         |-java

              |-com

                   |-example

                       |--cmdline

                                |-BUILD

                                |-Runner.java

                       | Greeting.java

                       | ProjectRunner.java

 

|-WORKSPACE

 

workspace 구성

- workspace 파일은 project root 바로 아래에 위치.

- Bazel 에게 다를 BUILD 파일들을 어떻게 빌드할 것인지 알려주는 역할.

 

BUILD file 이해하기

BUILD 파일은 여러 인스트럭션을 포함, 하지만 역시 가장 중요한 것은 build rule (output shape and so on)

BUILD 파일은 target 이나 point 로 불림. 하나의 빌드 파일이 다른 BUILD 파일들 을 pointing 할수도 있음

java_binary(
    name = "ProjectRunner",
    srcs = glob(["src/main/java/com/example/*.java"]),
)

-> output 은 binary. -> jar 로 빌드될 예정. 

-> name attribute 는 mandatory (타겟명)

 

프로젝트 Build 하기

bazel build //:ProjectRunner

- // : workspace 의 root 에 대한 BUILD 파일의 상대경로 , 

- ProjectRunner 는 name BUILD 파일의 name attribute

 

빌드 결과로 실행하기

빌드후 binary는 bazel-bin 디렉토리 내에 저장된다.

bazel-bin/ProjectRunner

디펜던시 그래프 리뷰하기

- Bazel은 BUILD 파일에 빌드 디펜던시를 명시적으로 선언해야 한다. 이를 이용해 bazel 은 프로젝트의 dependency graph 를 그릴 수 있다. 

bazel query  --notool_deps --noimplicit_deps "deps(//:ProjectRunner)" --output graph

 

result:

digraph mygraph {

  node [shape=box];

  "//:ProjectRunner"

  "//:ProjectRunner" -> "//:src/main/java/com/example/Greeting.java\n//:src/main/java/com/example/ProjectRunner.java"

  "//:src/main/java/com/example/Greeting.java\n//:src/main/java/com/example/ProjectRunner.java"

}

 

멀티플 빌드를 하도록 수정해보자

java_binary(
    name = "ProjectRunner",
    srcs = ["src/main/java/com/example/ProjectRunner.java"],
    main_class = "com.example.ProjectRunner",
    deps = [":greeter"],
)

java_library(
    name = "greeter",
    srcs = ["src/main/java/com/example/Greeting.java"],
)

result

digraph mygraph {
  node [shape=box];
  "//:ProjectRunner"
  "//:ProjectRunner" -> "//:greeter"
  "//:ProjectRunner" -> "//:src/main/java/com/example/ProjectRunner.java"
  "//:greeter"
  "//:greeter" -> "//:src/main/java/com/example/Greeting.java"
  "//:src/main/java/com/example/ProjectRunner.java"
  "//:src/main/java/com/example/Greeting.java"
}

 

멀티플 패키지를 사용해보자

이를 위해 greeter target 의 visibility 를 package private 으로 올려주자

java_library(
    name = "greeter",
    srcs = ["src/main/java/com/example/Greeting.java"],
    visibility = ["//src/main/java/com/example/cmdline:__pkg__"]
)

그리고 cmdline 을 빌드하고 실행해보자

bazel build //src/main/java/com/example/cmdline:runner

 

Go rules for Bazel

github.com/bazelbuild/rules_go