Perguntas frequentes

Se você tiver dúvidas ou precisar de suporte, consulte Como obter ajuda .

O que é Bazel?

Bazel é uma ferramenta que automatiza compilações e testes de software. As tarefas de compilação com suporte incluem a execução de compiladores e vinculadores para produzir programas e bibliotecas executáveis ​​e a montagem de pacotes implantáveis ​​para Android, iOS e outros ambientes de destino. Bazel é semelhante a outras ferramentas como Make, Ant, Gradle, Buck, Pants e Maven.

O que há de especial em Bazel?

O Bazel foi projetado para se adequar ao modo como o software é desenvolvido no Google. Possui as seguintes características:

  • Suporte a vários idiomas: o Bazel suporta muitos idiomas e pode ser estendido para suportar linguagens de programação arbitrárias.
  • Linguagem de compilação de alto nível: Os projetos são descritos na linguagem BUILD , um formato de texto conciso que descreve um projeto como conjuntos de pequenas bibliotecas, binários e testes interconectados. Em contraste, com ferramentas como o Make, você precisa descrever arquivos individuais e invocações do compilador.
  • Suporte multiplataforma: A mesma ferramenta e os mesmos arquivos BUILD podem ser usados ​​para construir software para diferentes arquiteturas e até plataformas diferentes. No Google, usamos o Bazel para criar tudo, desde aplicativos de servidor executados em sistemas em nossos data centers até aplicativos clientes executados em telefones celulares.
  • Reprodutibilidade: Em arquivos BUILD , cada biblioteca, teste e binário deve especificar completamente suas dependências diretas. O Bazel usa essas informações de dependência para saber o que deve ser reconstruído quando você faz alterações em um arquivo de origem e quais tarefas podem ser executadas em paralelo. Isso significa que todas as compilações são incrementais e sempre produzirão o mesmo resultado.
  • Escalável: o Bazel pode lidar com grandes compilações; no Google, é comum que um binário de servidor tenha 100 mil arquivos de origem, e as compilações em que nenhum arquivo foi alterado levam cerca de 200 ms.

Por que o Google não usa...?

  • Make, Ninja: Essas ferramentas dão um controle muito exato sobre quais comandos são invocados para construir arquivos, mas cabe ao usuário escrever as regras corretas.
    • Os usuários interagem com o Bazel em um nível superior. Por exemplo, o Bazel possui regras internas para “teste Java”, “binário C++” e noções como “plataforma de destino” e “plataforma host”. Essas regras foram testadas em batalha para serem infalíveis.
  • Ant e Maven: Ant e Maven são voltados principalmente para Java, enquanto o Bazel lida com vários idiomas. O Bazel incentiva a subdividir as bases de código em unidades reutilizáveis ​​menores e pode reconstruir apenas aquelas que precisam de reconstrução. Isso acelera o desenvolvimento ao trabalhar com bases de código maiores.
  • Gradle: Os arquivos de configuração do Bazel são muito mais estruturados que os do Gradle, permitindo que o Bazel entenda exatamente o que cada ação faz. Isso permite mais paralelismo e melhor reprodutibilidade.
  • Pants, Buck: Ambas as ferramentas foram criadas e desenvolvidas por ex-Googlers no Twitter, Foursquare e Facebook, respectivamente. Eles foram modelados com base no Bazel, mas seus conjuntos de recursos são diferentes, então não são alternativas viáveis ​​para nós.

De onde veio Bazel?

Bazel é uma versão da ferramenta que o Google usa para construir seu software de servidor internamente. Ele também se expandiu para criar outros softwares, como aplicativos móveis (iOS, Android) que se conectam aos nossos servidores.

Você reescreveu sua ferramenta interna como open-source? É um garfo?

O Bazel compartilha a maior parte de seu código com a ferramenta interna e suas regras são usadas para milhões de compilações todos os dias.

Por que o Google criou o Bazel?

Há muito tempo, o Google construiu seu software usando grandes Makefiles gerados. Isso levou a construções lentas e não confiáveis, que começaram a interferir na produtividade de nossos desenvolvedores e na agilidade da empresa. Bazel foi uma maneira de resolver esses problemas.

O Bazel requer um cluster de compilação?

O Bazel executa operações de compilação localmente por padrão. No entanto, o Bazel também pode se conectar a um cluster de compilação para compilações e testes ainda mais rápidos. Consulte nossa documentação sobre execução remota e armazenamento em cache e armazenamento em cache remoto para obter mais detalhes.

Como funciona o processo de desenvolvimento do Google?

Para nossa base de código do servidor, usamos o seguinte fluxo de trabalho de desenvolvimento:

  • Todo o nosso código de servidor está em um único e gigantesco sistema de controle de versão.
  • Todo mundo constrói seu software com o Bazel.
  • Diferentes equipes possuem diferentes partes da árvore de origem e disponibilizam seus componentes como destinos BUILD .
  • A ramificação é usada principalmente para gerenciar versões, então todos desenvolvem seu software na revisão principal.

O Bazel é a base dessa filosofia: como o Bazel exige que todas as dependências sejam totalmente especificadas, podemos prever quais programas e testes são afetados por uma alteração e analisá-los antes do envio.

Mais informações sobre o processo de desenvolvimento no Google podem ser encontradas no blog de ferramentas de engenharia .

Por que você abriu o Bazel?

Construir software deve ser divertido e fácil. Compilações lentas e imprevisíveis tiram a diversão da programação.

Por que eu iria querer usar o Bazel?

  • O Bazel pode fornecer tempos de compilação mais rápidos porque pode recompilar apenas os arquivos que precisam ser recompilados. Da mesma forma, ele pode pular a reexecução de testes que sabe que não foram alterados.
  • Bazel produz resultados determinísticos. Isso elimina a distorção entre compilações incrementais e limpas, laptop e sistema de CI, etc.
  • O Bazel pode criar diferentes aplicativos de cliente e servidor com a mesma ferramenta no mesmo espaço de trabalho. Por exemplo, você pode alterar um protocolo cliente/servidor em um único commit e testar se o aplicativo móvel atualizado funciona com o servidor atualizado, construindo ambos com a mesma ferramenta, colhendo todos os benefícios mencionados do Bazel.

Posso ver exemplos?

Sim; veja um exemplo simples ou leia o código-fonte do Bazel para um exemplo mais complexo.

Em que Bazel é melhor?

Bazel brilha na construção e teste de projetos com as seguintes propriedades:

  • Projetos com uma grande base de código
  • Projetos escritos em (várias) linguagens compiladas
  • Projetos que são implantados em várias plataformas
  • Projetos que têm testes extensivos

Onde posso executar o Bazel?

O Bazel é executado em Linux, macOS (OS X) e Windows.

A portabilidade para outras plataformas UNIX deve ser relativamente fácil, desde que um JDK esteja disponível para a plataforma.

Para que não devo usar o Bazel?

  • Bazel tenta ser esperto sobre o armazenamento em cache. Isso significa que não é bom para executar operações de compilação cujas saídas não devem ser armazenadas em cache. Por exemplo, as etapas a seguir não devem ser executadas no Bazel:
    • Uma etapa de compilação que busca dados da Internet.
    • Uma etapa de teste que se conecta à instância de controle de qualidade do seu site.
    • Uma etapa de implantação que altera a configuração de nuvem do seu site.
  • Se sua compilação consiste em algumas etapas longas e sequenciais, o Bazel pode não ajudar muito. Você obterá mais velocidade dividindo etapas longas em alvos menores e discretos que o Bazel pode executar em paralelo.

Quão estável é o conjunto de recursos do Bazel?

Os recursos principais (C++, Java e regras de shell) têm uso extensivo no Google, portanto, são exaustivamente testados e têm muito pouca rotatividade. Da mesma forma, testamos novas versões do Bazel em centenas de milhares de destinos todos os dias para encontrar regressões e lançamos novas versões várias vezes por mês.

Resumindo, exceto pelos recursos marcados como experimentais, o Bazel deve apenas funcionar. As alterações nas regras não experimentais serão compatíveis com versões anteriores. Uma lista mais detalhada de status de suporte de recursos pode ser encontrada em nosso documento de suporte .

Quão estável é o Bazel como um binário?

Dentro do Google, garantimos que as falhas do Bazel sejam muito raras. Isso também deve valer para nossa base de código de código aberto.

Como posso começar a usar o Bazel?

Consulte Introdução .

O Docker não resolve os problemas de reprodutibilidade?

Com o Docker, você pode facilmente criar sandboxes com versões fixas do sistema operacional, por exemplo, Ubuntu 12.04, Fedora 21. Isso resolve o problema de reprodutibilidade para o ambiente do sistema – ou seja, “qual versão de /usr/bin/c++ eu preciso?”

O Docker não aborda a reprodutibilidade em relação às alterações no código-fonte. A execução do Make com um Makefile escrito de forma imperfeita dentro de um contêiner do Docker ainda pode gerar resultados imprevisíveis.

Dentro do Google, verificamos as ferramentas no controle de origem para reprodutibilidade. Desta forma, podemos vetar as mudanças nas ferramentas (“upgrade GCC para 4.6.1”) com o mesmo mecanismo que as mudanças nas bibliotecas base (“fix bounds check in OpenSSL”).

Posso criar binários para implantação no Docker?

Com o Bazel, você pode criar binários autônomos e vinculados estaticamente em C/C++ e arquivos jar independentes para Java. Eles são executados com poucas dependências em sistemas UNIX normais e, como tal, devem ser simples de instalar dentro de um contêiner do Docker.

O Bazel possui convenções para estruturar programas mais complexos, por exemplo, um programa Java que consome um conjunto de arquivos de dados ou executa outro programa como subprocesso. É possível empacotar esses ambientes como arquivos autônomos, para que possam ser implantados em diferentes sistemas, incluindo imagens do Docker.

Posso criar imagens do Docker com o Bazel?

Sim, você pode usar nossas regras do Docker para criar imagens reproduzíveis do Docker.

O Bazel tornará minhas compilações reproduzíveis automaticamente?

Para binários Java e C++, sim, supondo que você não altere a cadeia de ferramentas. Se você tiver etapas de compilação que envolvam receitas personalizadas (por exemplo, executar binários por meio de um script de shell dentro de uma regra), precisará tomar alguns cuidados extras:

  • Não use dependências que não foram declaradas. A execução em área restrita (–spawn_strategy=sandboxed, apenas no Linux) pode ajudar a encontrar dependências não declaradas.
  • Evite armazenar carimbos de data/hora e IDs de usuário em arquivos gerados. Arquivos ZIP e outros arquivos são especialmente propensos a isso.
  • Evite conectar-se à rede. A execução em área restrita também pode ajudar aqui.
  • Evite processos que usam números aleatórios, em particular, a travessia de dicionário é aleatória em muitas linguagens de programação.

Você tem versões binárias?

Sim, você pode encontrar os binários de lançamento mais recentes e revisar nossa política de lançamento

Eu uso Eclipse/IntelliJ/XCode. Como o Bazel interopera com IDEs?

Para o IntelliJ, confira o plug-in IntelliJ com Bazel .

Para XCode, confira Tulsi .

Para Eclipse, confira o plugin E4B .

Para outros IDEs, confira a postagem do blog sobre como esses plugins funcionam.

Eu uso Jenkins/CircleCI/TravisCI. Como o Bazel interage com os sistemas de CI?

O Bazel retorna um código de saída diferente de zero se a invocação de compilação ou teste falhar, e isso deve ser suficiente para a integração básica de CI. Como o Bazel não precisa de compilações limpas para correção, o sistema CI não deve ser configurado para limpar antes de iniciar uma execução de compilação/teste.

Mais detalhes sobre os códigos de saída estão no Manual do Usuário .

Quais recursos futuros podemos esperar no Bazel?

Veja nossos Roteiros .

Posso usar o Bazel para meu projeto INSERT LANGUAGE HERE?

Bazel é extensível. Qualquer pessoa pode adicionar suporte para novos idiomas. Muitos idiomas são suportados, consulte a enciclopédia de compilação para obter uma lista de recomendações e awesomebazel.com para obter uma lista mais abrangente.

Se você deseja desenvolver extensões ou aprender como elas funcionam, consulte a documentação para estender o Bazel .

Posso contribuir para a base de código Bazel?

Veja nossas diretrizes de contribuição .

Por que nem todo desenvolvimento é feito a céu aberto?

Ainda temos que refatorar as interfaces entre o código público no Bazel e nossas extensões internas com frequência. Isso torna difícil fazer muito desenvolvimento ao ar livre.

Você terminou o código aberto do Bazel?

O código aberto do Bazel é um trabalho em andamento. Em particular, ainda estamos trabalhando em código aberto:

  • Muitos de nossos testes de unidade e integração (que devem facilitar a contribuição de patches).
  • Integração completa com IDE.

Além do código, gostaríamos de ter todas as revisões de código, rastreamento de bugs e decisões de design acontecendo publicamente, com a comunidade Bazel envolvida. Ainda não chegamos lá, então algumas mudanças simplesmente aparecerão no repositório do Bazel sem uma explicação clara. Apesar dessa falta de transparência, queremos apoiar desenvolvedores externos e colaborar. Assim, estamos abrindo o código, embora parte do desenvolvimento ainda esteja acontecendo internamente ao Google. Informe-nos se algo parecer pouco claro ou injustificado à medida que fazemos a transição para um modelo aberto.

Existem partes do Bazel que nunca serão de código aberto?

Sim, parte da base de código se integra à tecnologia específica do Google ou procuramos uma desculpa para nos livrarmos (ou é uma combinação dos dois). Essas partes da base de código não estão disponíveis no GitHub e provavelmente nunca estarão.

Como entro em contato com a equipe?

Estamos disponíveis em bazel-discuss@googlegroups.com.

Onde posso reportar bugs?

Abra um problema no GitHub .

O que há com a palavra “Blaze” na base de código?

Este é um nome interno para a ferramenta. Por favor, refira-se a Bazel como Bazel.

Por que outros projetos do Google (Android, Chrome) usam outras ferramentas de compilação?

Até o primeiro lançamento (Alpha), o Bazel não estava disponível externamente, portanto, projetos de código aberto, como Chromium e Android, não podiam usá-lo. Além disso, a falta original de suporte ao Windows era um problema para a criação de aplicativos do Windows, como o Chrome. Como o projeto amadureceu e se tornou mais estável, o Android Open Source Project está em processo de migração para o Bazel.

Como se pronuncia "Bazel"?

Da mesma forma que “basil” (a erva) em inglês americano: “BAY-zel”. Ele rima com “avelã”. IPA: /ˈbeɪzˌəl/