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