As regras do Workspace são usadas para extrair dependências externas, geralmente código-fonte localizado fora do repositório principal.
Observação:além das regras nativas do espaço de trabalho, o Bazel também incorpora várias regras do espaço de trabalho do Starlark, principalmente aquelas para lidar com repositórios git ou arquivos hospedados na Web.
Regras
vincular
bind(name, actual, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
Atenção: não é recomendado usar bind(). Consulte "Considere remover o bind" para uma discussão longa sobre os problemas e alternativas. Em especial, considere o uso de repo_mappingatributos do repositório.
Aviso: select() não pode ser usado em bind(). Consulte as Perguntas frequentes sobre atributos configuráveis para mais detalhes.
Dá a um destino um alias no pacote //external.
O pacote //external não é um pacote "normal": não há um diretório external/,
então ele pode ser considerado um "pacote virtual" que contém todas as metas vinculadas.
Exemplos
Para dar um alias a um destino, bind no arquivo WORKSPACE. Por exemplo, suponha que haja um destino java_library chamado //third_party/javacc-v2. Isso pode ser feito adicionando o seguinte ao arquivo WORKSPACE:
bind(
name = "javacc-latest",
actual = "//third_party/javacc-v2",
)
Agora, os destinos podem depender de //external:javacc-latest em vez de
//third_party/javacc-v2. Se o javacc-v3 for lançado, a regra bind poderá ser
atualizada, e todos os arquivos BUILD que dependem de //external:javacc-latest passarão a
depender do javacc-v3 sem precisar ser editados.
O Bind também pode ser usado para disponibilizar destinos em repositórios externos para seu espaço de trabalho.
Por exemplo, se houver um repositório remoto chamado @my-ssl importado no arquivo
WORKSPACE e ele tiver uma meta cc_library //src:openssl-lib, você poderá
criar um alias para essa meta usando bind:
bind(
name = "openssl",
actual = "@my-ssl//src:openssl-lib",
)
Em seguida, em um arquivo BUILD no seu espaço de trabalho, o destino vinculado pode ser usado da seguinte maneira:
cc_library(
name = "sign-in",
srcs = ["sign_in.cc"],
hdrs = ["sign_in.h"],
deps = ["//external:openssl"],
)
Em sign_in.cc e sign_in.h, os arquivos de cabeçalho expostos por
//external:openssl podem ser referenciados usando o caminho relativo à raiz
do repositório. Por exemplo, se a definição da regra para @my-ssl//src:openssl-lib for assim:
cc_library(
name = "openssl-lib",
srcs = ["openssl.cc"],
hdrs = ["openssl.h"],
)
Então, as inclusões de sign_in.cc podem ficar assim:
#include "sign_in.h" #include "src/openssl.h"
Argumentos
| Atributos | |
|---|---|
name |
Um nome exclusivo para esse destino. |
actual
|
Esse destino precisa existir, mas pode ser qualquer tipo de regra (incluindo vinculação). Se esse atributo for omitido, as regras referentes a esse destino em |
local_repository
local_repository(name, path, repo_mapping)
Permite que destinos de um diretório local sejam vinculados. Isso significa que o repositório atual pode usar destinos definidos nesse outro diretório. Consulte a seção de vinculação para mais detalhes.
Exemplos
Suponha que o repositório atual seja um cliente de chat, com raiz no diretório ~/chat-app. Ele
gostaria de usar uma biblioteca SSL definida em um repositório diferente: ~/ssl. A biblioteca SSL tem um destino //src:openssl-lib.
O usuário pode adicionar uma dependência a essa meta incluindo as seguintes linhas em ~/chat-app/WORKSPACE:
local_repository(
name = "my-ssl",
path = "/home/user/ssl",
)
Os destinos especificariam @my-ssl//src:openssl-lib como uma dependência para depender dessa
biblioteca.
Argumentos
| Atributos | |
|---|---|
name |
Um nome exclusivo para esse destino. |
path
|
Precisa ser um caminho para o diretório que contém o arquivo WORKSPACE do repositório. O caminho pode ser absoluto ou relativo ao arquivo WORKSPACE do repositório principal. |
repo_mapping
|
Por exemplo, uma entrada |
new_local_repository
new_local_repository(name, build_file, build_file_content, path, repo_mapping, workspace_file, workspace_file_content)
Permite que um diretório local seja transformado em um repositório do Bazel. Isso significa que o repositório atual pode definir e usar destinos de qualquer lugar no sistema de arquivos.
Essa regra cria um repositório do Bazel criando um arquivo WORKSPACE e um subdiretório que contém
symlinks para o arquivo BUILD e o caminho fornecido. O arquivo de build precisa criar destinos relativos ao
path. Para diretórios que já contêm um arquivo WORKSPACE e um arquivo BUILD, use a regra
local_repository.
Exemplos
Suponha que o repositório atual seja um cliente de chat, com raiz no diretório ~/chat-app. Ele gostaria de usar uma biblioteca SSL definida em um diretório diferente: ~/ssl.
O usuário pode adicionar uma dependência criando um arquivo BUILD para a biblioteca SSL (~/chat-app/BUILD.my-ssl) que contenha:
java_library(
name = "openssl",
srcs = glob(['*.java'])
visibility = ["//visibility:public"],
)
Em seguida, adicione as seguintes linhas a ~/chat-app/WORKSPACE:
new_local_repository(
name = "my-ssl",
path = "/home/user/ssl",
build_file = "BUILD.my-ssl",
)
Isso vai criar um repositório @my-ssl que cria symlinks para /home/user/ssl.
Os destinos podem depender dessa biblioteca adicionando @my-ssl//:openssl às dependências de um destino.
Você também pode usar new_local_repository para incluir arquivos individuais, não apenas
diretórios. Por exemplo, suponha que você tenha um arquivo jar em /home/username/Downloads/piano.jar. Você
pode adicionar apenas esse arquivo ao build incluindo o seguinte no arquivo WORKSPACE:
new_local_repository(
name = "piano",
path = "/home/username/Downloads/piano.jar",
build_file = "BUILD.piano",
)
e criando o arquivo BUILD.piano a seguir:
java_import(
name = "play-music",
jars = ["piano.jar"],
visibility = ["//visibility:public"],
)
@piano//:play-music para usar piano.jar.
Argumentos
| Atributos | |
|---|---|
name |
Um nome exclusivo para esse destino. |
build_file
|
É preciso especificar build_file ou build_file_content. Esse atributo é um rótulo relativo ao espaço de trabalho principal. O arquivo não precisa ser chamado BUILD, mas pode ser. Algo como BUILD.new-repo-name pode funcionar bem para distinguir dos arquivos BUILD reais do repositório. |
build_file_content
|
É preciso especificar build_file ou build_file_content. |
path
|
Ele pode ser absoluto ou relativo ao arquivo WORKSPACE do repositório principal. |
repo_mapping
|
Por exemplo, uma entrada |
workspace_file
|
É possível especificar "workspace_file" ou "workspace_file_content", mas não ambos. Esse atributo é um rótulo relativo ao espaço de trabalho principal. O arquivo não precisa ter o nome WORKSPACE, mas pode ter. Algo como WORKSPACE.new-repo-name pode funcionar bem para distinguir dos arquivos WORKSPACE reais do repositório. |
workspace_file_content
|
É possível especificar "workspace_file" ou "workspace_file_content", mas não ambos. |