> ## Documentation Index
> Fetch the complete documentation index at: https://site.aspect.build/llms.txt
> Use this file to discover all available pages before exploring further.

# Aspect Build, built on Bazel

> Aspect Build offers Bazel solutions, including a rules docsite, BUILD file automation, and a more user-friendly CLI. Explore more at aspect.build

export const BlogPost = ({title, date, authors, tags, image, children}) => {
  const tagList = tags ? tags.split(", ").filter(Boolean) : [];
  const tagSlug = t => t.toLowerCase().replace(/&/g, "").replace(/\+/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
  const formattedDate = date ? new Date(date + "T00:00:00").toLocaleDateString("en-US", {
    year: "numeric",
    month: "long",
    day: "numeric"
  }) : "";
  return <section className="w-full flex justify-center px-4 py-12 md:py-16">
      <div style={{
    maxWidth: "800px",
    width: "100%"
  }}>
        {image && (typeof image === "string" ? <img noZoom src={image} alt={title} className="w-full rounded-xl mb-8" style={{
    maxHeight: "400px",
    objectFit: "cover"
  }} /> : <div className="blog-post-hero-image">{image}</div>)}
        <h1 className="text-3xl md:text-4xl font-bold text-zinc-900 dark:text-white">
          {title}
        </h1>
        <div className="flex flex-wrap items-center gap-3 mt-4 text-sm text-zinc-500 dark:text-zinc-400">
          {authors && <span>{authors}</span>}
          {authors && formattedDate && <span>·</span>}
          {formattedDate && <span>{formattedDate}</span>}
        </div>
        {tagList.length > 0 && <div className="flex flex-wrap gap-2 mt-3">
            {tagList.map(tag => <a key={tag} href={"/blog/tags/" + tagSlug(tag)} className="px-2 py-0.5 rounded-full text-xs bg-zinc-100 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 hover:bg-blue-100 dark:hover:bg-blue-900/40 hover:text-blue-700 dark:hover:text-blue-300 transition">
                {tag}
              </a>)}
          </div>}
        <hr className="my-8 border-zinc-200 dark:border-zinc-700" />
        <div className="prose dark:prose-invert max-w-none">{children}</div>
      </div>
    </section>;
};

export const MarketingPage = () => <div className="marketing-page-marker" style={{
  display: "none"
}} />;

export const Section = ({children, className = "", gray = false, dark = false, id}) => <section id={id} className={`w-full flex justify-center px-4 py-16 md:py-24 ${gray ? "bg-gray-50 dark:bg-zinc-900" : dark ? "bg-zinc-900 dark:bg-zinc-950" : ""} ${className}`}>
    <div className="w-full" style={{
  maxWidth: "1140px"
}}>
      {children}
    </div>
  </section>;

<MarketingPage />

<BlogPost title="Aspect Build, built on Bazel" date="2021-11-17" authors="Alex Eagle" tags="Bazel, Company">
  <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/blog/stock/circuit-board.jpg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=011b528d80219d61336df3f6169eee73" alt="" className="blog-post-cover" width="800" height="533" data-path="images/blog/stock/circuit-board.jpg" />

  We've been hard at work building a great consulting business at [Aspect](https://aspect.build). We are helping some large companies like Robinhood and Boston Dynamics migrate their build, test, and CI systems to Bazel. However, it's clear from all our engagements that Bazel itself is incomplete. We are excited to announce some products we've built to help fill in this gap.

  ## Rules Docsite

  Bazel doesn't come with "batteries included". It only understands a few languages in the built-in distribution like Java, Python, and C++. For everything else, it relies on plugins called "rulesets".

  The first problem our customers found with rulesets is that the documentation is lacking. There is usually a very simple example of usage, and then as soon as you need something more real, you are stuck reading sources. So we've launched the first Bazel rules docsite, at

  [https://aspect.build/docs](https://aspect.build/docs)

  Our docsite scrapes the generated API output of canonical rulesets, using the resulting protocol buffers to drive a custom site. It's blazing fast because the content is all build-time pre-rendered. Other features of our docsite:

  * **Unified**: All the Bazel rules documented in a single place.

  * **Search**: You can search across the documentation for all rulesets.

  * **Versioned**: Every documentation page is permalinked to an exact version and won't change. You can select the version of a ruleset that you use.

  * **Deep-links**: You can link directly to an attribute of a rule, so it's quicker to help out your fellow humans.

  Ultimately our goal is to improve the upstream documentation across the rulesets by making the documentation easy to edit in-place, with the convenience of a wiki, through a standard pull request process.

  ## `BUILD` file generation

  Bazel's `BUILD` files are wonderfully explicit and self-contained, but largely mirror dependency information that was already evident in the source files. At most clients we've observed that Product Engineers don't want to learn about build systems, and we think they shouldn't need to.

  Aspect is making a big investment in [Gazelle](https://github.com/bazelbuild/bazel-gazelle), which automates maintenance of `BUILD` files. We upstreamed the [Python Gazelle plugin](https://github.com/bazelbuild/rules_python/tree/main/gazelle/README.md) to rules\_python and have started work on plugins for TypeScript and other languages.

  ## Rules Authors SIG

  We've long been the core maintainers of [rules\_nodejs](https://github.com/bazelbuild/rules_nodejs) and also help to maintain [rules\_python](https://github.com/bazelbuild/rules_python) and [rules\_docker](https://github.com/bazelbuild/rules_docker). After working with our clients, we have a much better appreciation for how much companies depend on these rules, yet how little maintenance effort goes into them.

  Sadly many corporate contributors haven't been able to get their changes merged, and maintainers haven't benefitted from the resources these large companies can provide. For this reason, we led the creation of the first Special Interest Group (SIG) under Bazel's [new SIG program](https://bazel.build/sig.html). Find it at [SIG Rules Authors](https://github.com/bazelbuild/community/blob/main/sigs/rules-authors/CHARTER.md).

  ## More usable CLI

  We see that most engineers interact with Bazel on the command-line, and many are baffled by its complex error messages and unfamiliar terminology. It's an expert tool, being used by engineers who would rather not become build system experts.

  `aspect` is a new command-line interface wrapping Bazel. The `aspect` CLI is interactive, and customizable for your organization's developer workflows. It's compatible with `bazel` so you can switch back and forth easily. While it's currently a pre-release, we are excited for the future of this tool.

  Read more at [https://aspect.build](https://aspect.build).

  ## We can't wait to build a better Bazel!

  If you're as excited about build tooling as we are, then let's work together! Visit aspect.build or participate in the SIG as a funder or a coder.
</BlogPost>
