please is a free, open source build & deployment project written in Go and released under Apache-2.0. It has 2,612 GitHub stars, 221 forks and 120 open issues, and was last pushed 9 hours ago. On this registry it ranks #42 of 59 tracked projects in Build & Deployment, with 5 head-to-head comparisons available.

What is please?

What it is

Please is an open-source, cross-language build system for reproducible multi-language builds. It belongs to the developer tools and build-and-deployment ecosystem, and its topics place it alongside Bazel, Buck, and Pants as a monorepo build tool. The project is written in Go, licensed under Apache-2.0, and actively supported on Linux, macOS, and FreeBSD.

It addresses builds that involve more than simple compilation. Projects often mix languages, generate code, template deployment configuration, publish artifacts, and run tests across a large repository. Please gives those steps one consistent command line interface, so users can build any target with plz build and test any target with plz test without learning a separate tool for each language.

Key capabilities

  • Please supports multi-language builds and can automate compilation, testing, code generation, and artifact publication.
  • Please caches artifacts by hashing file inputs and environment variables rather than using last modified timestamps.
  • Please runs hermetic tasks that access only explicitly defined inputs, enabling parallel execution without interference.
  • Please supports shared remote caches so outputs can be reused across machines and teams.
  • Please provides plz init to create a default configuration at the project root.
  • Please extends the build system with custom definitions such as genrule().
  • Please is written in Go, and it avoids startup overhead from VMs, interpreted code, or remote JVM processes.

Who uses it and how

  • Teams building monorepos use one command line interface for targets written in different languages.
  • Projects with generated code or deployment configuration use Please to coordinate those steps with compilation.
  • Developers following the Docker and Kubernetes codelab build a Kubernetes-based application, deploy to a local cluster, and push to a remote registry.
  • Users needing custom behavior follow the genrule() codelab to add project-specific build definitions.
  • Local developers install Please on Linux, macOS, or FreeBSD and initialize a repository root.

Getting started

Users install Please with curl -s https://get.please.build | bash, a release tarball, or Homebrew, then run plz init at the project root.

When to use it — and when not to

Please is useful when a repository needs to coordinate multiple languages, generated code, deployment configuration, or artifact publication under one reproducible model. If a project uses one language, has no generated code, and does not publish artifacts, the README states that it might not need Please and contrasts it with Maven, pip, or go build. Please requires project-specific configuration and is supported on Linux, macOS, and FreeBSD rather than as a hosted service.

project readme (upstream, from github) — read inline

Please Build Status Build Status Go Report Card Gitter chat

Please is a cross-language build system with an emphasis on high performance, extensibility and reproducibility. It supports a number of popular languages and can automate nearly any aspect of your build process.

See please.build for more information.

Currently Linux (tested on Ubuntu), macOS and FreeBSD are actively supported.

If you're a fan of Please, don't forget to add yourself to the adopters file.

Getting Started

The easiest way to install it on your own machine is to run:

curl -s https://get.please.build | bash

Or, if you prefer, grab one of the tarballs off our releases page and extract it yourself; it typically lives in ~/.please.

You can also install using Homebrew:

brew tap thought-machine/please
brew install please

Then you simply run plz init at the root of your project to set up a default config and you're ready to go. The best way to get to grips with Please is through the codelabs! There's also the getting started guide that explains the core concepts.

How is it so fast?

Please has a robust and correct caching model that enables us to aggressively cache artifacts. Caching is based on the hashes of inputs (both files, and environment variables) to each rule rather than last modified timestamps. Builds are hermetic so don't have access to anything they haven't explicitly defined as inputs. This means that if anything changes, we know exactly what might've been affected, so the minimal set of targets get built and tested.

Because each task is hermetic, they can be run in parallel without any chance of interfering with each-other. Combine these two concepts with shared remote caches, and it makes for a blazing fast build system for any language or technology.

Please is also written in Go and every effort has been made to make it as fast as possible. There's no startup time waiting to bring up VMs, interpreting code or communicating with remote JVM processes. The code itself takes full advantage of Go's concurrency and asynchronicity. The end result is a snappy command line tool that gets to work immediately and feels great to use.

Why Please, and not Maven, pip, or go build?

A build system is more than just a mechanism for invoking the compiler. If you're working on just one language, don't have any code generation, and don't need to publish any artifacts anywhere, you might not need Please. Chances are this is not the case.

Building software often involves more than just compiling code. There's deployment config to template, code to generate, and quite often, there's more than one language involved. Please provides a powerful, comprehensive, and understandable framework that you can use to craft a truly holistic build process.

Please does this through a consistent and seamless command line interface; there's no need to learn new build systems and technologies for different languages. Build any target with plz build, test any target with plz test, no matter what's going on under the hood.

The Docker & Kubernetes codelab covers building a Kubernetes based application with Please, including reliably deploying code to a local cluster, and pushing it to a remote registry.

The genrule() codelab covers extending Please with custom build definitions to truly automate any part of your deployment process.

Why Please, and not make?

Make is a great tool for running tasks. It's easy enough to understand because it leaves you very close to the shell. The problem is, it has limited capability to build out complexity. There have been attempts to generate make files from higher level tools like cmake and ninja, but they fall short of what Please sets out to achieve.

The Please build language is a full programming language. There are a high level set of build rules that make up a declarative DSL to define build targets, however you can drop into an imperative language that resembles python when necessary:

subinclude("//my_custom_defs:markdown_page")

pages = []
for page in glob(include = ["*.md"]):
    pages += markdown_page(
        name = page.removesuffix(".md"),
        srcs = [page],
        visibility = ["//website/..."],
    )

go_binary (
    name = "webserver",
    srcs = ["main.go"],
    deps = ["//third_party/go:protobuf"],
    data = pages,
    visibility = ["//services/foo/..."],
)

This is distinctively operating at a higher level when compared to make:

protobuf:
    go install google.golang.org/protobuf

webserver: protobuf
    go tool compile --pack foo.go -o foo.a

pages: ???

Additionally, make builds are not hermetic. The above make example installs protobuf into the host machines Go path. Please builds only have access to files and environment variables they have explicitly been given access to. You can play around in the environment targets are built in with plz build //some/target --shell. Additionally, on linux systems, Please can take this a step further with Linux namespaces to improve sandboxing especially of the network. Please also has built in task parallelism so can take full advantage of multi-core machines which were not a consideration 40 years ago when make was designed.

Finally, Please has a robust caching mechanism base on hashing the inputs of each rule. Makes cache invalidation is based on the last modified timestamp which can change unexpectedly forwards and backwards in time. Combine this with hermetic builds, and Please caching is never incorrect.

Why Please, not Bazel, Buck or Pants?

These build systems are all very similar so choosing between them can be hard. Please originally replaced buck implementing the subset of features we used. We found that buck (and the competition) worked great when using the supported languages but fell flat when breaking new ground.

The biggest difference between Please and the competition is that Please is designed from the ground up to be extensible. The built-in languages are all defined in the same build language as you use to define your targets, demonstrating that there's nothing special about them. This puts the build definitions where they should be: in your domain. You have all the same tools Please has to expand your build definitions to satisfy your needs.

Please does all this with a focus on simplicity and transparency. There are a limited amount of concepts that are needed to get started and once they are grocked, the possibilities are endless. Please relies on these concepts rather than requiring lots of magic and incantation. Configuration is simple and largely optional so getting going is easy, and there's no single WORKSPACE file nobody really owns, with lines of configuration that nobody really understands.

The command line interface is designed with similar considerations in mind. Subcommands can be added to Please though aliases and tie into the Please tab-completions. Not only can flags and arguments be completed, but they can also leverage the build graph to complete labels enabling you to truly craft your developer experience the way you want it.

Building Please

If you're looking to get involved, check out the contributor guidance to help you get started. If you're a fan of Please, don't forget to add yourself to the adopters file.

To build Please yourself, run ./bootstrap.sh in the repo root. This will bootstrap a minimal version of Please using Go and then rebuild it using itself. You'll need to have Go 1.23+ installed.

Optional dependencies for various tests include Python, Java, clang, gold and docker - none of those are required to build components so their tests will be excluded if they aren't available.

If you'd rather not worry about installing the dependencies, we provide a prebuilt Docker image based o

readme truncated — read the full docs on github

Frequently asked questions

Is please free to use?

please is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does please do?

High-performance extensible build system for reproducible multi-language builds.

What is please written in?

please is primarily written in Go. Its source is publicly available at https://github.com/thought-machine/please, and it has 2,612 GitHub stars.