# 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