2. In Maven
Pom files determine the
build units.
group_id:artifact_0
group_id:artifact_1
scala_project
├── pom.xml
├── m0
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── scala
│ │ └── com
│ │ └── example
│ │ └── Example.scala
│ └── test
│ └── scala
│ └── com
│ ├── example
│ └── ExampleTest.scala
└── m1
├── pom.xml
└── src
└── main
3. In Bazel
You control the level of granularity
to build.
scala_project
├── WORKSPACE
└── src
└── main
└── scala
└── com
├── example
│ ├── A.scala
│ ├── B.scala
│ └── C.scala
└── example2
├── D.scala
├── E.scala
└── F.scala
4. The unit of
organization is the
package
scala_project
├── WORKSPACE
└── src
└── main
└── scala
└── com
├── example
│ ├── A.scala
│ ├── B.scala
│ └── C.scala
└── example2
├── D.scala
├── E.scala
└── F.scala
Package
5. To define a package
you need to declare a BUILD file in it
scala_project
├── WORKSPACE
└── src
└── main
└── scala
└── com
├── example
│ ├── A.scala
│ ├── B.scala
│ ├── BUILD
│ └── C.scala
└── example2
├── D.scala
├── E.scala
└── F.scala
Package
6. The elements of a
package are called
Targets
scala_project
├── WORKSPACE
└── src
└── main
└── scala
└── com
├── example
│ ├── A.scala
│ ├── B.scala
│ ├── BUILD
│ └── C.scala
└── example2
├── D.scala
├── E.scala
└── F.scala
Target
targets are one of two principal kinds,
files and rules.
7. Target is an instance
of a Rule
scala_project
├── WORKSPACE
└── src
└── main
└── scala
└── com
├── example
│ ├── A.scala
│ ├── B.scala
│ ├── BUILD
│ └── C.scala
└── example2
├── D.scala
├── E.scala
└── F.scala
Relationship between a set of input
and a set of output files
Target
B.scala -> scala_library -> B.jar
Foo.cc + Foo.h -> cc_library -> Foo.dll
8. scala_project
├── WORKSPACE
└── src
├── main
│ └── scala
│ └── com
│ └── example
│ ├── A.scala
│ ├── B.scala
│ ├── BUILD
│ ├── C.scala
│ └── Example.scala
└── test
└── scala
└── com
└── example
├── BUILD
├── ExampleTest.scala
└── ExampleTest2.scala
BUILD
targets
examples
scala_library(
name="a",
srcs=[
"A.scala",
],
deps = ["c"])
scala_library(
name="c",
srcs=[
"C.scala",
])
scala_library(
name="example_test",
srcs=glob(["Example*.scala"]))
a
c
Example_test
9. All Bazel builds take
place in a workspace.
Scala_project
├── WORKSPACE
└── src
├── main
│ └── scala
│ └── com
│ └── example
│ ├── A.scala
│ ├── B.scala
│ ├── BUILD
│ ├── C.scala
│ └── Example.scala
└── test
└── scala
└── com
└── example
├── ExampleTest.scala
A workspace is a directory in the file
system that contains a file named
WORKSPACE.
The file contain references to external
dependencies or could be empty
10. Workspace file example
Scala_project
├── WORKSPACE
└── src
├── main
│ └── scala
│ └── com
│ └── example
│ ├── A.scala
│ ├── B.scala
│ ├── BUILD
│ ├── C.scala
│ └── Example.scala
└── test
└── scala
└── com
└── example
├── ExampleTest.scala
maven_server(
name = "default",
url =
"http://repo.dev.wixpress.com/artifactory/li
bs-snapshots",
)
maven_jar(
name = "guava",
artifact =
"com.google.guava:guava:18.0",
)
...
11. All build targets
are referenced using Labels
The target labels are relative to the
location of the workspace file.
//src/main/scala/com/example:a
a
Scala_project
├── WORKSPACE
└── src
├── main
│ └── scala
│ └── com
│ └── example
│ ├── A.scala
│ ├── B.scala
│ ├── BUILD
│ ├── C.scala
│ └── Example.scala
└── test
└── scala
└── com
└── example
├── ExampleTest.scala