O Bazel cria softwares a partir do código-fonte organizado em uma árvore de diretórios chamada
workpace. Os arquivos de origem no espaço de trabalho são organizados em uma hierarquia aninhada de
pacotes, em que cada pacote é um diretório que contém um conjunto de arquivos de origem
relacionados e um arquivo BUILD
. O arquivo BUILD
especifica qual software
como as saídas podem ser criadas a partir da fonte.
Espaço de trabalho
Um espaço de trabalho é uma árvore de diretórios no sistema de arquivos que contém os arquivos
de origem do software que você quer criar. Cada espaço de trabalho tem um arquivo de texto chamado
WORKSPACE
, que pode estar vazio ou conter referências a dependências
externas necessárias para criar as saídas.
Os diretórios que contêm um arquivo chamado WORKSPACE
são considerados a raiz de um
espaço de trabalho. Portanto, o Bazel ignora todas as árvores de diretórios em um espaço de trabalho com acesso root
um subdiretório que contém um arquivo WORKSPACE
, porque eles formam outro espaço de trabalho.
O Bazel também oferece suporte ao arquivo WORKSPACE.bazel
como um alias do arquivo WORKSPACE
. Se
ambos os arquivos existirem, WORKSPACE.bazel
será usado.
Repositórios
O código é organizado em repositories. O diretório que contém o WORKSPACE
é a raiz do repositório principal, também chamado de @
. Outro, (externo)
os repositórios forem definidos no arquivo WORKSPACE
usando regras de espaço de trabalho ou
geradas a partir de módulos e extensões no sistema Bzlmod. Consulte a visão geral
das dependências externas para mais informações.
As regras do espaço de trabalho agrupadas com o Bazel estão documentadas na documentação Regras na seção Build Enciclopédia e a documentação sobre recursos incorporados Regras de repositório do Starlark.
Como os repositórios externos são repositórios, eles geralmente contêm um
arquivo WORKSPACE
. No entanto, esses arquivos WORKSPACE
adicionais são
ignoradas pelo Bazel. Em particular, os repositórios dependentes transitivamente não são
adicionados automaticamente.
Pacotes
A unidade principal de organização de código em um repositório é o pacote. Um pacote é um conjunto de arquivos relacionados e uma especificação de como eles podem ser usados para produzir artefatos de saída.
Um pacote é definido como um diretório que contém um
arquivo BUILD
chamado BUILD
ou BUILD.bazel
. Um
inclui todos os arquivos em seu diretório e todos os subdiretórios abaixo dele,
exceto aqueles que contêm um arquivo BUILD
. Com base nessa definição,
ou diretório pode fazer parte de dois pacotes diferentes.
Por exemplo, na árvore de diretórios a seguir, há dois pacotes, my/app
e o subpacote my/app/tests
. Observe que my/app/data
não é um pacote, mas
um diretório pertencente ao pacote my/app
.
src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc
Destinos
Um pacote é um contêiner de destinos, que são definidos no
arquivo BUILD
. A maioria dos destinos é de um dos dois tipos principais: arquivos e regras.
Os arquivos são divididos em dois tipos. Os arquivos de origem geralmente são gravados por os esforços das pessoas e fez check-in no repositório. Os arquivos gerados, às vezes chamados de arquivos derivados ou de saída, não são enviados, mas são gerados a partir de arquivos de origem.
O segundo tipo de segmentação é declarado com uma regra. Cada instância de regra especifica a relação entre um conjunto de entrada e um conjunto de arquivos de saída. O entradas de uma regra podem ser arquivos de origem, mas também podem ser saídas regras de firewall.
Se a entrada para uma regra é um arquivo de origem ou um arquivo gerado está na maioria casos irrelevantes; o que importa é apenas o conteúdo desse arquivo. Este fato facilita a substituição de um arquivo fonte complexo por um arquivo gerado produzido pelo uma regra, como acontece quando o ônus de manter manualmente um sistema um arquivo estruturado se torna cansativo, e alguém escreve um programa para derivá-lo. Nenhuma alteração é necessária para os consumidores desse arquivo. Por outro lado, um arquivo gerado pode ser facilmente substituído por um arquivo de origem com apenas alterações locais.
As entradas de uma regra também podem incluir outras regras. O significado preciso dessas relacionamentos geralmente é bastante complexo e depende da linguagem ou da regra, mas intuitivamente é simples: uma regra de biblioteca A do C++ pode ter outra regra de biblioteca B do C++ para uma entrada. O efeito dessa dependência é que os arquivos de cabeçalho de B estão disponíveis para A durante a compilação, os símbolos de B estão disponíveis para A durante a vinculação e os dados de execução de B estão disponíveis para A durante a execução.
Uma invariante de todas as regras é que os arquivos gerados por uma regra sempre pertencem ao o mesmo pacote da própria regra, não é possível gerar arquivos outro pacote. Não é incomum que as entradas de uma regra venham de outra .
Grupos de pacotes são conjuntos de pacotes cujo objetivo é limitar a acessibilidade de
determinadas regras. Os grupos de pacotes são definidos pela função package_group
. Elas
têm três propriedades: a lista de pacotes que contêm, o nome e outros
grupos de pacotes que incluem. As únicas maneiras permitidas de se referir a elas são
visibility
das regras ou do atributo default_visibility
de
a função package
; mas não geram nem consomem arquivos. Para mais
mais informações, consulte a package_group
na documentação do Google.