# Introducing Please
---
# Make is great
--
### Using as a task runner
*Simplified interface to developers*
```bash
# Start the development environment
make up
# Build the program
make build
# Run the executable
make run
# Run tests and the linter
make test lint
# Stop everything and clean up
make down
```
--
### Using as a build system
```go
// hello.go
package main
func main() { println("Hello, World!") }
```
```makefile
# Makefile
hello: hello.go
go build -o hello
```
```bash
# Build it
make hello
> go build -o hello
# Build it again
make hello
> make: `hello' is up to date.
```
--
### Traditional Makefile
```makefile
CC=gcc
CFLAGS=-I.
DEPS = hellomake.h
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: hellomake.o hellofunc.o
$(CC) -o hellomake hellomake.o hellofunc.o
```
--
### Large project
```
├── cmd
│ ├── pipeline
│ │ └── ...
│ └── worker
│ └── ...
├── ...
├── internal
│ ├── app
│ │ ├── pipeline
│ │ │ ├── auth
│ │ │ │ └── token
│ │ │ │ └── ...
...
423 directories, 1647 files
```
--
### Better tooling
```bash
# make hello
go build -o hello ./...
# make test
go test -run ^TestIntegration$
```
--
### Make nowadays
- mostly used as a task runner
- outdated as a build system
- doesn't scale well for large projects
- hard to reuse rules
---
## Modern build systems
--
<img width="200" src="img/bazel.svg" alt="Bazel" style="border: none; box-shadow: none; background-color: transparent; margin-right: 100px;">
<img width="200" src="img/buck.svg" alt="Buck" style="border: none; box-shadow: none; background-color: transparent; margin-right: 100px;">
<img width="100" src="img/pants.png" alt="Pants" style="border: none; box-shadow: none; background-color: transparent; margin-right: 100px;">
--
### Modern build systems
- have a concept of packages
- are file based (similarly to make)
- provide hermetic, incremental builds
- use caching to speed up builds
- often have server side components
--
### BUILD files
```
go_binary(
name='greet',
srcs=[
'main.go',
],
deps=[
':greeting',
],
)
```
---
## Please
--
### Please
- similar to Bazel
- built by ex-Googlers
- **written in Go**
- has a cool name: `plz build`
---
*(10 minutes break to make puns)*
--
### Compared to make
```bash
# Build
plz build //cmd/pipeline
# Run
plz run //cmd/pipeline
# Test
plz test //cmd/pipeline:all
# Arbitrary tasks
plz lint # plz run :golangci-lint
```
--
## DEMO
---
# The End