> ## 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 at BazelCon 2023

> Discover Aspect's BazelCon updates: bazel lint, bazel-lib 2.0, rules_py, partnership with Chainguard, and more. Watch our talks and explore new features.

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 at BazelCon 2023" date="2023-10-30" authors="Alex Eagle" tags="Bazel, Company">
  <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/blog/hashnode/hn-8357d11a0e.jpeg?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=f8ccf7c285ead7cc7f9339f4b0f0a44d" alt="" className="blog-post-cover" width="2734" height="2890" data-path="images/blog/hashnode/hn-8357d11a0e.jpeg" />

  We had a great time visiting Google's Munich office for the BazelCon conference. This annual event is always a big milestone for us, so I've written up a summary of the product announcements and links to our talks.

  ### bazel lint

  We announced the first release of our `bazel lint` support. This is in two parts:

  1. an OSS repository [aspect-build/rules\_lint](https://github.com/aspect-build/rules_lint) which integrates many formatting and linting tools under Bazel, and

  2. a new `lint` [command](https://aspect.build/docs/cli/tasks/lint) in the Aspect CLI which allows you to run linters without requiring they have the same "hard error" semantics as tests.

  Here's a quick demo:

  <a href="https://asciinema.org/a/xQWU1Wc1JINOubeguDDQbBqcq">
    <img noZoom src="https://asciinema.org/a/xQWU1Wc1JINOubeguDDQbBqcq.svg" alt="asciicast" className="block" />
  </a>

  In the next release of [Aspect Workflows](https://www.aspect.build/workflows) you'll be able to see these lint warnings as "expert code review comments" on your GitHub code reviews. This matches how Google wires up linters in the internal developer workflow. It allows you to turn on a new check for newly introduced code without being forced to fix or suppress all existing occurrences first.

  <img noZoom src="https://mintcdn.com/aspectbuild/x1L7Iep716jCyJVo/images/blog/hashnode/hn-7f6b70efb5.png?fit=max&auto=format&n=x1L7Iep716jCyJVo&q=85&s=f135b79d0d732b372cf1b59fa33a4440" alt="" className="block mx-auto" width="1044" height="606" data-path="images/blog/hashnode/hn-7f6b70efb5.png" />

  ### bazel-lib 2.0

  [bazel-lib](https://github.com/aspect-build/bazel-lib) is the "standard library" Aspect uses to write Bazel rules and BUILD files for our clients. With over 20 Bazel rulesets, we have learned a lot of common patterns and encoded them for you to re-use.

  Our 2.0 release adds a `tar` rule, which is a simpler alternative to the `pkg_tar` rule in rules\_pkg. You can find details in the [tar rule documentation](https://github.com/aspect-build/bazel-lib/blob/main/docs/tar.md).

  The lead engineer for bazel-lib, Derek Cormier, gave a BazelCon talk *bazel-lib for BUILD and rules authors* which you can watch here: [https://www.youtube.com/watch?v=IXimf4DCAoY\&t=27947s](https://www.youtube.com/watch?v=IXimf4DCAoY\&t=27947s)

  ### rules\_py

  Aspect engineers have been among the most [active maintainers](https://github.com/bazelbuild/rules_python/graphs/contributors) of the rules\_python ruleset. We added the hermetic interpreter, Gazelle extension, wheel publishing, and much more.

  However, we have found that the "Google internal" approach for laying out Python programs on the disk is too far from the Python ecosystem standard of creating a virtual environment (virtualenv). rules\_py aims to solve this with re-implementations of the `py_*` rules that are more compatible, and therefore have fewer bugs and work with your editor.

  Our Staff Engineer, Matt Mackay gave a BazelCon talk *Python & Bazel: Aspect's rules\_py* which you can watch here: [https://www.youtube.com/watch?v=IXimf4DCAoY\&t=28536s](https://www.youtube.com/watch?v=IXimf4DCAoY\&t=28536s)

  ### Partnership with Chainguard

  [Chainguard](https://www.chainguard.dev/) is solving the "supply-chain security" problem of base images for containers. They funded our work on [rules\_apko](https://registry.bazel.build/modules/rules_apko), which integrates their Wolfi "un-distro" with Bazel, and we just released v1.0! This lets engineers easily and securely assemble a base image using the same Bazel idioms they already understand, and without the downsides of a Dockerfile that can contain arbitrary code and executes non-reproducible commands within a container runtime.

  Read more in our Blog post: [https://blog.aspect.dev/rules-apko](https://blog.aspect.dev/rules-apko)

  ### Day 2 "Keynote"

  Alex kicked off the second day of BazelCon with *I'm an Imposter and So Can You! Working in multiple languages at once*. This was not a technical talk, rather it explored the feelings of being out of place in a Developer Infrastructure team that's supporting and steering the work of product engineers who use unfamiliar languages. Watch the talk: [https://www.youtube.com/watch?v=IXimf4DCAoY\&t=118s](https://www.youtube.com/watch?v=IXimf4DCAoY\&t=118s)

  ### Aspect Workflows and Rules

  Finally, Alex presented Aspect's products, both paid services and OSS rulesets. You can watch the *Aspect Workflows* talk here: [https://www.youtube.com/watch?v=8Dc8R\\\_Zrf6M\&t=10680s](https://www.youtube.com/watch?v=8Dc8R\\_Zrf6M\&t=10680s)
</BlogPost>
