[HN Gopher] When to use Bazel? ___________________________________________________________________ When to use Bazel? Author : jvolkman Score : 100 points Date : 2022-09-13 18:46 UTC (4 hours ago) (HTM) web link (earthly.dev) (TXT) w3m dump (earthly.dev) | cstrahan wrote: | There's an issue I reported (along with a proof of concept fix) | over 4 years ago, that has yet to be fixed: building a mixed | source project containing Go & C++ & C++ protocol buffers results | in silently broken binaries as rules_go will happily _not_ | forward along the linker arguments that the C++ build targets | (the protobuf ones, using the built in C++ rules) declare. | | See https://github.com/bazelbuild/rules_go/issues/1486 | | Not very confidence inspiring when Google's build system falls | over when you combine three technologies that are used commonly | throughout Google's code base (two of which were _created_ by | Google). | | If you're Google, sure, use Bazel. Otherwise, I wouldn't | recommend it. Google will cater to their needs and their needs | only -- putting the code out in the open means you get the | privilege of sharing in their tech debt, and if something isn't | working, you can contribute your labor to them for free. | | No thanks :) | rjsw wrote: | Unless it becomes easier to port to a new operating system, | never. | mplewis9z wrote: | Personally, I've found Bazel's tooling and dependency management | to be extremely aggressive at pushing you to online-only | development as your project scales in size. A company I worked | for that used it lost multiple person-days for every engineer | they had when Covid hit and the VPN went to crap. | | It's great at being able to offload work to a remote server, but | in my opinion that should never be the only way you can get work | done. Local development should always be the default, with remote | execution being an _option_ when available. | trzy wrote: | Last year I tried doing a side project with a talented ex-Google | buddy who insisted we set up Bazel to replace my simple Makefile. | Three weeks later it still wasn't working on my Windows box. We | had a mixed Python and C++ code base and I like to use MinGW64 | gcc on Windows. He blamed Windows and tried to get me to switch | to Mac (no thanks, lol) and eventually he lost interest and gave | up. The project went on to win an OpenCV funded competition and | became the basis of a startup -- good job, GNU Make! | | So the answer IMHO to "when to use Bazel" is "never" :) | dbt00 wrote: | I've used bazel at medium size (100+ engineers, multiple | languages) and tried to use it at a small size (20 engineers, | almost all go with a tiny bit of C) and I think the "never" and | "unless there's no other way" answers from this interview are | pretty good. | hot_gril wrote: | In general, if someone wants to beef up the tooling in my | project that I know is fine to begin with, I still say "I don't | mind, go ahead, but I will continue using my old tooling until | yours works with no regression." Half the time, they abandon | it. I don't even know how Bazel works cause I've never felt | enough pain with makefiles etc to research an alternative. | | Also, Google tooling knowledge doesn't transfer very well to | outside projects. Everything is special on the inside there. | They use an internal version of Bazel called Blaze that's | totally integrated with everything, with entire teams dedicated | to the tooling, and only a few officially supported programming | languages, so of course it works smoothly. | moosedev wrote: | I used it for several years inside Google, and TBH it was | often painful in the ways external users have described in | this thread. When I was doing something very "normal" from | the point of view of Google's monolithic codebase, i.e. | targeting a C++ binary intended to run on Google's | distributed computing platform, I found it smooth enough, if | awfully verbose. When I was doing something less vanilla, but | not necessarily uncommon, e.g. targeting Android, iOS, | Windows, it was painful, and I spent a lot of time working | around it or understanding the chains/mountains of clever | things others had built to work around it. | | I understood some of the design decisions and tradeoffs for | why it works the way it does, but I didn't like it. I | certainly wouldn't reach for it for a personal project. | Possibly I still just didn't "get it". I've used dozens* of | build systems at this point, but hey. | | * possibly exaggerating | dessant wrote: | > Google tooling knowledge doesn't transfer very well to | outside projects. | | A good number of their open source projects fall apart in | real-world use. If you visit their repositories you'll often | get the sense that beyond working on interesting problems, | their engineers have no desire to properly maintain these | projects for the next few years. The gamble of relying on a | Google product unfortunately also applies to their open | source projects. | phist_mcgee wrote: | Maybe that's because the average tenure at google is so | short? | thayne wrote: | Bazel probably wasn't a good fit for that project, especially | if your makefile was simple. | | But where it does work well, is when you have a large complex | codebase in a monorepo, and you need reliable caching to keep | build times down. | lhorie wrote: | I mean, Python (moreso its ecosystem) is notoriously difficult | to get working w/ Bazel idiomatically. Bazel is advertised as a | language agnostic system (and to be fair, it's better at it | than, say, Buck), but in practice it tends to work better w/ | stacks that already have some degree of hermeticity (Go, Java), | whereas YMMV very much with the more loosey-goosey stacks | (Python, JS). | | IMHO, Bazel is a classic example of Conway's law[0], and it | falls squarely in the "big corp" class of software. You have to | be running into issues like 6+ digit CI compute costs or | latency SLOs in hundreds-of-teams monorepos before Bazel really | starts to make sense as a potential technical solution. | | [0] https://en.wikipedia.org/wiki/Conway%27s_law | IshKebab wrote: | That's like saying you should never build a house with concrete | foundations because they take so long to dig and pour and the | first layer of bricks doesn't need them anyway! | | Get back to me when you work for a company with a monorepo that | has to build and test _everything_ in CI for every change | (taking something like 200 CPU hours) because they didn 't have | the foresight to use Bazel. | hot_gril wrote: | Software development isn't housing development. You lay a | concrete foundation knowing exactly what is being built on | top. The typical way of developing software is like adding | stories to your house until it falls over, then rebuilding it | stronger, which is perfectly fine in the software world. | Otherwise things get overengineered. | | In practical terms, the makefile or whatever is usually good | enough. | drewcoo wrote: | > company with a monorepo that has to build and test | everything in CI for every change | | That smells like covering up an architecture problem (tight | coupling) with a build tool. Not a recipe for success. | deathanatos wrote: | I don't think that's actually the case. Bazel, AIUI, | understands the entire dependency tree _and can cache steps | effectively_ , which a Makefile cannot (alone) do. (You | could certainly build it into one.) | | CI tooling is orthogonal; your CI tooling can invoke Bazel | or Makefile+custom caching, it wouldn't really matter. But | the problem in CI is that you lack state; whereas a | developer's machine might e.g., have a bunch of .o files | from a previous build, CI will be starting from a clean | slate1. So builds take longer. My understanding of Bazel is | that it has decent support for caching and can thus makes | those rebuilds a lot faster, which it has b/c it | understands exactly the inputs to the steps at hand. | (Which, if you write your own caching layer, you'd have to | figure out.) | | ... but ... I've also seen the same thing the top commenter | has, with Bazel: endless suggestions to use Bazel ... but | migrating a large existing codebase is _pain_ , and if | you're not willing to put your work where your mouth is ... | then the status quo prevails. | | 1While here CI lacking state is a sort of negative b/c of | the time we need to rebuild it, normally, I think this is a | good thing: it means you're constantly verifying you can | build from scratch. Or, at least, something close to | scratch, modulo things like vendoring. (I.e., if you do an | "apt-get" from Ubuntu's servers in your CI pipeline ... | well ... your build obviously isn't quite from scratch.) | hot_gril wrote: | Google uses a monorepo intentionally, and for good reasons. | They're also a massive company. For them, a complex build | system makes sense... and even that system isn't exactly | Bazel. | yamtaddle wrote: | My experience is that Windows is a constant source of headaches | if you're supporting development and builds on multiple | platforms and trying not to just write every build-related | thing twice, Bazel or no Bazel. Likelihood of it being a PITA | goes up fast the more complex the build & tools (probably why | Make did better than Bazel). | | I assume it's OK if it's your only platform--though I got my | programming start on Windows, with open-source languages, and | distinctly recall how managing the same tools and builds got | _way_ easier and more reliable when I switched to Linux. | Luckily WSL2 is getting semi-decent and can call out to Windows | tools, so it 's getting easier to standardize on one or another | unixy scripting language for glue, even if some of your tools | on Windows are native. | | Part of the trouble with it, though, is that there are multiple | ways to end up with some kind of linux-ish environment on it, | and that all of them introduce quirks or oddities. You end up | having to wrestle with stupid questions like "which copy of | OpenSSH is this tool using?" It's probably less-bad if you're | in a position to strictly dictate what Windows dev machines | have installed on them, I suppose. Git is installed, but only | with options X, Y, and Z checked, no other configurations | allowed; WSL2 is installed and has packages A, B, and C | installed; and so on, crucially preventing the installation of | _other_ things that might try to pile on more weirdness and | unpredictability. | | Those kinds of messes are _possible_ on macOS or Linux or | FreeBSD or what have you, but generally don 't happen. I think | it happens on Windows because every tool's trying to vendor in | various Linux-compat dependencies rather than force a | particular system configuration on users, or having to try to | deal with whatever maybe-not-actually-compatible similar tools | the user has installed. So they vendor them in to reduce | friction and the rate of spurious bug reports. Basically, the | authors of these tools are seeing the same problems as anyone | trying to configure cross-platform development with Windows in | the mix, and are throwing up their hands and vendoring in their | deps, which compounds the problem for anyone trying to | coordinate several such tools because there's a tendency for | everything to end up with weird configurations that don't play | well together. | trzy wrote: | All excellent points but Windows is a very widely used | platform (perhaps the most widely used, by some metrics) and | it's actually quite nice for development. It's hard to take | tools seriously that don't work on it. | | Unpopular opinion but I think the Unix approach of lots of | little tools with arcane configuration files all blaming each | other sucks. I get why it exists, why it became popular, and | why it remains popular in some scenarios, but I don't feel | beholden to it. | yamtaddle wrote: | Right--in some sense it's not really Windows' _fault_ that | something like Git is barely-portable and relies on a rube- | goldberg-machine pile of scripts and binaries in several | languages with the result that it has to ship half a unix | environment to work somewhere that 's very non-unix, or | that open-source software in general treats Windows the way | web developers treat Firefox. | | OTOH, in practice, if you're using a lot of open source | tools and have developers working on every single halfway- | plausible OS _except_ windows, things are probably pretty | OK, but then you throw Windows in the mix and suddenly the | time you spend supporting your builds & tools shoots way | up. That makes it _feel_ like it 's Windows' fault. | cma wrote: | Android is an even bigger pain, suddenly you have to call | Java code just to map memory and can't even have a simple | C api for something as low level as that. | yamtaddle wrote: | As a development and/or build environment? Never used it | that way, myself. Agree that as a build _target_ , and as | far as its various first-party developer-facing features | and libraries and SDKs and such go, it's got weirdly-many | rough edges and half-baked-but-heavily-promoted junk for | such a major platform. | moonchrome wrote: | >and it's actually quite nice for development | | If we are talking about stuff like backend web development | then I'd say no, it's actually a pain to work with - few | people bother deploying to Windows these days, many | libraries/frameworks treat it like a second class citizen, | tooling doesn't translate well (or at all). | | Even frontend webdev is very unixy due to node/npm and | popularity of Macs in that space. | | When you're talking about OpenCV, GPU related things, game | dev then the situation is reversed. | | So it highly depends on what you're developing. | vbezhenar wrote: | I think we each live in our own bubbles. I see very few | people on macs or linuxes, almost everyone uses Windows | and they're fine with web development. What's so unixy | about node/npm? They feel like very good windows | citizens. | Cu3PO42 wrote: | For the most part npm has worked for me on Windows, but | it's so incredibly slow compared to even npm in a Linux | VM on the same host. I understand this is mostly due to | FS overhead related to a multitude of small files. | | Obviously this isn't a deal breaker in most situations, | but it is a bit annoying. I've observed similar | performance problems running Webpack on Windows in the | past. | hot_gril wrote: | > It's hard to take tools seriously that don't work on it. | | In my experience, most software development tools don't | work on it, at least not as well as on Unix-like systems. | But I'm not a game dev. | londons_explore wrote: | Don't use tools outside what they're designed for... | | Specifically, Bazel is really at home with Java/C++ and Linux. | Sure, it kinda works elsewhere, but you should be considering | other options. | badoongi wrote: | My take - Avoid Bazel as long as you can, for most companies the | codebase is not big enough to actually need distributed builds, | if you've hit this problem Bazel is probably the best thing you | can do today, if you're that big you can probably spare the few | dozen headcount needed to make Bazel experience in your company | solid. | | Bazel takes on dependency management, which is probably an | improvement for a C++ codebase where there is no de-facto package | manager. For modern languages like golang where a package manager | is widely adopted by the community it's usually just a pain. e.g | Bazel's offering for golang relies on generating "Bazel | configurations" for the repositories to fetch, this alternative | definition of dependencies is not what all the existing go | tooling are expecting, and so to get the dev tooling working | properly you end up generating one configuration from the other | having 2 sources of truth, and pains when there's somehow a | mismatch. | | Bazel hermeticity is very nice in theory, in practice many of the | existing toolchains used by companies that are using Bazel are | non-hermetic, resulting in many companies stuck in the process of | "migration to Bazel remote execution" forever. | | Blaze works well in Google's monorepo where all the dependencies | are checked in (vendored), the WORKSPACE file was an afterthought | when it was opensourced, and the whole process of fetching remote | dependencies in practice becomes a pain for big monorepos (I just | want to build this small golang utility, `bazel build | //simple:simple` and you end up waiting for a whole bunch of | python dependencies you don't need to be downloaded). | | And this is all before talking about Javascript, if your JS | codebase wasn't originally designed the way Bazel expects it | you're probably up for some fun. | intellix wrote: | as an angular developer, Bazel was promised to replace webpack | behind the scenes and suddenly everything would get fast and all | our problems would be solved. Months... Years went by until | eventually it became an opt-in solution and I guess they just | gave up trying to use it. | setheron wrote: | I can never wrap my head around writing a tool chain in bazel | [deleted] | grahamplace wrote: | Worth pointing out that Build Buddy (YC W20) has an enterprise | Bazel product that tries to make some of the management of Bazel | easier. | | I haven't used it myself so no commentary, I just have a friend | who started there recently so it's on my radar | | https://www.buildbuddy.io/ | https://www.ycombinator.com/companies/buildbuddy | xwowsersx wrote: | Only tangentially related, but can someone give me the pitch for | Earthly? I think I'm just missing something basic. | | Our CI consists of tests, builds and deployments (all docker | containers) that are kicked off in bitbucket pipelines. Is there | some way that either our local development or CI builds can be | improved by using earthly? Appreciate any info! | choeger wrote: | Very nice work. Worth a read! | an_d_rew wrote: | I will quote my past self | (https://news.ycombinator.com/item?id=26064845) | | We use Bazel's rules_docker as well, and I would caution someone | evaluating it with a note from out experience. | | What Bazel does well (and as well as Bazel fits your use-case) | Bazel does extremely well and is a reproducible joy to use. | | But if you stray off that path even a tiny bit, you're often in | for a surprisingly inexplicable, unavoidable, far-reaching pain. | | For example, rules_docker is amazing at laying down files in a | known base image. Everything is timestamped to the 1970 unix | epoch, for reproducibility, but hey, it's a bit-perfect | reproduction. | | Need to run one teensy executable to do even the smallest thing | that's trivial with a Dockerfile? Bazel mist create the image | transfer it to a docker daemon, run the command, transfer it | back... your 1 kb change just took 5 minutes and 36 gb of data | being tarred, gzipped, and flung around (hopefully-the-local) | network. | | It may not be a dealbreaker, and you may not care, but be | forewarned that these little surprises creep up fairly ofen from | unexpected quarters! | | Edit: after 2-ish years of Bazel, I would say that for 99% of | developers and organizations, the most likely answer is "never". | miiiiiike wrote: | I lost a month learning Bazel last year. Never again. Here's a | challenge: Create a Bazel built Angular library using only the | publicly available documentation. Here, I'll save you some time: | You can't. | | What documentation exists is flawed and what isn't flawed has | massive holes. It was so bad that I had to ask a few Google | employees if there was secret internal documentation somewhere. | There isn't, and, they almost all hated using it as well. | | I went back to Make and had the whole repo building in an | afternoon. | | Bazel is a great idea but like most other Google OSS projects it | doesn't have strong enough documentation to form a community or | enough of a community to create good docs. | | Even if I brute forced my way into using Bazel, I couldn't ask an | employee to learn it. | | I hear that Blaze is much easier to work with. | [deleted] | dietrichepp wrote: | I've been using Bazel for side projects these days, including | small retro game projects for old game consoles. The entry price | was high, but it works so well I have a hard time imagining | working without it. | | For retro game projects, the core of your game might be written | in C or C++, which you want cross-compiled. That's easily within | reach of stuff like makefiles. But then I start adding a bunch of | custom tooling--I want to write tools that process sprites, | audio, or 3D models. These days I tend to write those tools in | Go. I'm also working with other people, and I want to be able to | cross-compile these tools for Windows, even though I'm developing | on Linux or macOS. | | My Bazel repository will download the ARM toolchain automatically | and do everything it needs to build the target. I don't really | need to set up my development environment at all--I just need to | install Bazel and a C compiler, and Bazel will handle the rest. I | don't need to install anything else on my system, and the C | compiler is only needed because I'm using protocol buffers (Bazel | downloads and compiles protoc automatically). | synergy20 wrote: | Makefile can do all that too, without java dependency and | straightforward to read at any time later, what real extra | benefit Bazel brings in here. | kldx wrote: | Can make do incremental builds based on checksums instead of | modification time? How about distributing the build across a | cluster in a language agnostic way? | jpollock wrote: | Bazel is more strict about what constitutes a dependency | change. It doesn't use mtime on the file, it relies on the | checksum. It also considers the command line flags to be part | of the cache key. | | So, spurious changes (touching a file) will result in a cache | hit, while hidden changes (changing an environment flag used | by Make) are caught. | | This is particularly important if verifiable builds are | needed for SoX compliance. | aaaaaaaaaaab wrote: | What if I use the __DATE__ macro? | jvolkman wrote: | You'll get "redacted" | | https://github.com/bazelbuild/bazel/blob/34ce6a23f5a2be58 | bb5... | jpollock wrote: | Yes, you can go out of your way to make your builds non- | deterministic. That should break in Make as well. | | I don't know enough about bazel to answer your question | definitively, but "stamping" is what you want to search | for. | | https://bazel.build/docs/user-manual | kmarc wrote: | The better question is, what if you change a comment? | | It checksums the preprocessed files, so neither | `__DATE__`, no comment changes should affect your build | times. | jpollock wrote: | I think __DATE__ without redaction pushes the dependency | change 1 level down, to the .o file. | | The .a/.so/.exe would no longer match the inputs (the .o | files), causing a re-link. | vbezhenar wrote: | Does it re-read every single source file to find out which | were changed? Sounds like a terrible approach. Or it uses | mtime first and checksum after that? | yata69420 wrote: | The benefit is that it keeps a huge graph of all | dependencies, so everything from the toolchain through your | application can be built with hashing and caching. Sort of | like make, but decentralized and based on hashed file | contents. | | Once you have bazel, you can distribute the workload so that | you could have thousands of machines each producing artifacts | to be shared with other build machines. | | Then you can set up your dev machine to rely on those caches, | so your local builds either use everything directly from | cache or instruct a remote builder to produce the artifact | for you. | | No matter what you change, because the dependencies are | graphed precisely, you only need to rebuild a very tiny set | of artifacts impacted by your change. | | Of course, this doesn't actually work in practice. | | Your builds probably aren't deterministic, so your graph of | artifacts won't be either, causing lots of stuff to rebuild. | Also, it may work great for something like Java that produces | class files, but not provide any caching at all for ruby. | | Debugging and supporting it is a full time job for a team of | engineers that dramatically outweighs the cost of keeping | your projects sensibly sized. | | You might think that as the project gets larger, it's totally | worth it to use bazel for that sweet caching. But in reality | the graph construction and querying will become so bloated | that just figuring out which targets need to rebuilt becomes | a full time engineering effort that breaks constantly with | all tooling upgrades. | | Also, the plugin ecosystem is just poor. | | Bazel is the perfect storm of computer scientists loving big | graphs, Google exporting an open source project and then | rebuilding it internally, and inexperienced engineers being | sold on a tech as being obviously right because all the big | players use it. | dietrichepp wrote: | > Makefile can do all that too, | | I guess it's theoretically possible, but why would you do | this? This sounds like some kind of "I want to prove it can | be done" project like running a web server on a Commodore 64, | or making a kitchen knife out of cardboard. Yes, you could | figure out a way to download and install dependencies using | Make and Curl, and maybe you could build the same library for | multiple targets using a bunch of variable expansions, | possibly by invoking make multiple times, or including the | same makefile multiple times. Make sucks; it sucks a lot; I'd | be miserable. | | And then if you aren't very careful, you'll end up forgetting | to declare some dependency, or some flag change will | invalidate your build but Make won't do anything, or you'll | make a change to your makefile and forget to clean, and then | you spend another hour or day debugging some build that was | made out of stale parts. I've done this before, which is why | I avoid make for everything but the smallest projects. | | > without java dependency | | Bazel does not have a Java dependency. I think you might be | assuming that because Bazel is written in Java, somehow that | means that Java must be installed on your computer. This is | not true. Bazel is a self-contained executable you can drop | in /usr/local/bin. | | I really don't understand your perspective here at all. I've | seen people defend make, but make is full of so many traps | and gotchas--I wonder how someone could use make and then | decide that these traps and gotchas are okay. The projects | that successfully use it tend to be small projects, use | generated makefiles (automake, cmake, etc), or tend to be a | bit simpler. | | I use make myself, but as a rule of thumb, only for projects | with a few files. | ajconway wrote: | Bazel doesn't have any user-facing java dependency. | | > what real extra benefit Bazel brings in here | | Builds are hermetic by default, so unless the developer | chooses to escape the sandbox, everything is guaranteed to | build on other machines with no additional setup. | | (Also, I genuinely hate when I have to manually install build | dependencies system-wide and pray that there will not be any | conflicts. Having everything pinned to specific sha256 or git | hashes by design is a breath of fresh air) | blueblob wrote: | I used a M1 Mac to try to build tensorflow and tensorflow- | text and it is very untrue that everything is guaranteed to | build on other machines with no additional setup. | | The parenthesized comment is funnier to me because I had to | download a specific bazel version to build. | jvolkman wrote: | > The parenthesized comment is funnier to me because I | had to download a specific bazel version to build. | | If you use bazelisk to provide your `bazel` command, | it'll download the appropriate Bazel version for the repo | you're trying to build. | | https://github.com/bazelbuild/bazelisk | ajconway wrote: | That is true, Bazel itself is still evolving, and there | have been breaking changes between versions. Sometimes | the required version number is placed in a .bazelversion | file, which makes Bazelisk your top-level dependency. | | I'd expect Tensorflow to have some non-hermetic build | actions, but if choosing a specific Bazel version was the | only thing that was required to build it, that's awesome! | IshKebab wrote: | The benefits that it brings is the whole reason it exists: | precise dependency tracking. | | That means you can't have missing dependency links ( _very_ | common and hard to debug in Make or CMake for example). You | can _know_ what outputs a change affects so you can only | build /test a subset of the project in CI. Incremental builds | become totally reliable. Etc. | steeve wrote: | Trying to learn Bazel by porting an existing project to it is a | very hard way to get into this amazing tool. | | If possible, start fresh. | | I don't see myself working without it from now on. | tdeck wrote: | The thing is, something like Bazel only pays dividends on a | large complex project. When you're starting from scratch it's | unlikely you'll have any problems that Bazel helps to solve, | but you'll be spending a lot of time on the ceremony of setting | it up. | EdSchouten wrote: | Regardless of whether you should use Bazel or not, my hope is | that any future build systems attempt to adopt Bazel's remote | execution protocol (or at least a protocol that is similar in | spirit): | | https://github.com/bazelbuild/remote-apis | | In my opinion the protocol is fairly well designed. | lxe wrote: | When not to use Bazel: when attempting to shoehorn it into an | existing JavaScript monorepo. | spion wrote: | Yep. If its just JS, Turborepo would probably be a better | choice nowadays. | nyadesu wrote: | Would you mind explaining why? I use Nx and it's been good, | not perfect tho, so at this point I'm very skeptical about | toolchaining solutions that claim they 'just work' | bsimpson wrote: | I haven't used Turborepo, but I have really liked wireit. | wireit is from the Lit team at Google. They understand both | Bazel and JS. As I understand, wireit is their attempt to | make the Bazel niceties JS-native. | jsw wrote: | Bazel is a fully reproducible and hermetic build system. A lot of | painstaking work goes into it producing the exact same artifacts | build after build. And that provides some interesting properties | that you can leverage for artifact caching, deployments, and | CICD. | | We very happily runny a polyglot monorepo w/ 5+ languages, | multiple architectures, with fully reproducible artifacts and | deployment manifests, all deployed to almost all AWS regions on | every build. We update tens of thousands of resources in every | environment for every build. The fact that Bazel is creating | reproducible artifacts allow us to manage this seamlessly and | reliably. Clean builds take an hour+, but our GH self-hosted | runners often complete commit to green build for our devs in less | than a minute. | | The core concept of Bazel is very simple: explicitly declare the | input you pass to a rule/tool and explicitly declare the output | it creates. If that can click, you're half way there. | bmohlenhoff wrote: | I tried using Bazel a while back but immediately ran into a few | issues. | | The existing codebase I was working with did not lay out its | dependencies and files in the manner expected by Bazel so dealing | with dependency/include hell was frustrating. | | Then there was a large portion of the project that depended on | generated code for its interfaces (ie. similar to protobuf but | slightly different) and trying to dive into the Bazel rules and | toolchain with no other Bazel experience was not fun. I attempted | to build off of the protobuf implementation but kept finding | additional layers to the onion that didn't exactly translate to | the non protobuf tooling. The project documentation seemed out of | date in this area (ie. major differences in the rules engine | between 1.0 and subsequent versions) and I couldn't find many | examples to look at other than overly simplified toy examples. | | All in all a frustrating experience. I could not even get far | enough along to compile the interfaces for the project. | adamgordonbell wrote: | Author here. I wanted to get my head wrapped around when Bazel | was an excellent build solution, so I interviewed six people with | a lot of Bazel experience and picked their brains. | | This somewhat long article hopes to answer questions about Bazel | for future people in a similar position to me. If you know a lot | of Bazel then you might not learn much but if you've vaguely | heard of it and are not sure when its the tool that should be | reached for I'm hoping this will help. | mattboardman wrote: | Bazel is a great tool, but as mentioned in the article the | support from Google is rather limited. If bazel ever got to the | level Terraform is with providers it could really take off. | Something I'd love to see is a .bazel_mod file where you could | pull in other bazel workspaces (similar to go.mod) and reference | packages within those workspaces. | dimator wrote: | That's there now: | | https://bazel.build/build/bzlmod | mattboardman wrote: | TIL. Thanks for the link! | n0us wrote: | you can already do that with the WORKSPACE file | smeagull wrote: | Haven't yet gotten a single project using Bazel to build on any | of my machines. I don't think I'd adopt a build system that is so | frustrating. ___________________________________________________________________ (page generated 2022-09-13 23:00 UTC)