Regras do Workspace

Informar um problema Ver fonte Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

Ver origem da regra
bind(name, actual, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

Aviso: 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, as metas 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

Nome: obrigatório

Um nome exclusivo para essa segmentação.

actual

Rótulo; o padrão é None

O destino a ser aliased.

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 //external simplesmente não vão ver essa aresta de dependência. Isso é diferente de omitir a regra bind completamente: é um erro se uma dependência //external não tiver uma regra bind associada.

local_repository

Ver origem da regra
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 adicionando as seguintes linhas a ~/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

Nome: obrigatório

Um nome exclusivo para essa segmentação.

path

String; obrigatório

O caminho para o diretório do repositório local.

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

Dicionário: String -> String; o padrão é {}

Um dicionário do nome do repositório local para o nome do repositório global. Isso permite controles sobre a resolução de dependências do espaço de trabalho para dependências desse repositório.

Por exemplo, uma entrada "@foo": "@bar" declara que, sempre que este repositório depender de "@foo" (como uma dependência de "@foo//some:target"), ele vai resolver essa dependência em "@bar" ("@bar//some:target") declarado globalmente.

new_local_repository

Ver origem da regra
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 links simbólicos 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"],
)
Em seguida, as metas podem depender de @piano//:play-music para usar piano.jar.

Argumentos

Atributos
name

Nome: obrigatório

Um nome exclusivo para essa segmentação.

build_file

Nome; o padrão é None

Um arquivo para usar como um arquivo BUILD para este diretório.

É 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

String; o padrão é ""

O conteúdo do arquivo BUILD para este repositório.

É preciso especificar build_file ou build_file_content.

path

String; obrigatório

Um caminho no sistema de arquivos local.

Ele pode ser absoluto ou relativo ao arquivo WORKSPACE do repositório principal.

repo_mapping

Dicionário: String -> String; o padrão é {}

Um dicionário do nome do repositório local para o nome do repositório global. Isso permite controles sobre a resolução de dependências do espaço de trabalho para dependências desse repositório.

Por exemplo, uma entrada "@foo": "@bar" declara que, sempre que este repositório depender de "@foo" (como uma dependência de "@foo//some:target"), ele vai resolver essa dependência em "@bar" ("@bar//some:target") declarado globalmente.

workspace_file

Nome; o padrão é None

O arquivo a ser usado como o arquivo WORKSPACE para este repositório.

É 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

String; o padrão é ""

O conteúdo do arquivo WORKSPACE para este repositório.

É possível especificar workspace_file ou workspace_file_content, mas não ambos.