Regras do Workspace

Informar um problema Conferir origem Noite · 7,4 do Google. 7,3 · 7.2 · 7,1 · 7,0 · 6,5

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 de espaço de trabalho nativas, o Bazel também incorpora várias regras de espaço de trabalho do Starlark, em particular aquelas que lidam com repositórios ou arquivos do Git hospedados na Web.

Regras

vincular

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

Aviso: o uso de bind() não é recomendado. Consulte Considere remover o bind para uma discussão detalhada sobre os problemas e as alternativas. Em particular, considere o uso de repo_mapping atributos de repositório.

Aviso: select() não pode ser usado em bind(). Consulte as Perguntas frequentes sobre atributos configuráveis para detalhes.

Define um alias para um destino no pacote //external.

O pacote //external não é um pacote "normal": não há um diretório externo, então ele pode ser considerado um "pacote virtual" que contém todos os destinos vinculados.

Exemplos

Para atribuir um alias a um destino, bind no arquivo WORKSPACE. Por exemplo: suponha que há um destino java_library chamado //third_party/javacc-v2. Para atribuir um alias, adicione o seguinte ao campo 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 javacc-v3 for lançado, a regra bind poderá ser atualizados, e todos os arquivos BUILD que dependem de //external:javacc-latest serão atualizados. dependem de javacc-v3 sem precisar de edição.

A vinculação também pode ser usada 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 um destino cc_library //src:openssl-lib, será possível criar um alias para esse destino 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 principais expostos por O //external:openssl pode ser referenciado usando o caminho em relação ao próprio repositório. raiz. Por exemplo, se a definição de regra para @my-ssl//src:openssl-lib for semelhante a esta:

cc_library(
    name = "openssl-lib",
    srcs = ["openssl.cc"],
    hdrs = ["openssl.h"],
)

Em seguida, os elementos incluídos 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 associado.

Esse destino precisa existir, mas pode ser qualquer tipo de regra (incluindo vinculação).

Se esse atributo for omitido, as regras que se referem a esse destino no //external não terão acesso a essa borda de dependência. Isso é diferente de omitir bind regra completa: será um erro se uma dependência //external não tem uma regra bind associada.

local_repository

Conferir origem da regra
local_repository(name, path, repo_mapping)

Permite que os destinos de um diretório local sejam vinculados. Isso significa que o repositório atual pode usar destinos definidos neste outro diretório. Consulte a seção Vincular para mais detalhes.

Exemplos

Suponha que o repositório atual seja um cliente de chat, com acesso root no diretório ~/chat-app. Ela quiser usar uma biblioteca SSL definida em um repositório diferente: ~/ssl. A biblioteca SSL tem um //src:openssl-lib de destino.

O usuário pode adicionar uma dependência a esse destino 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 disso. biblioteca.

Argumentos

Atributos
name

Nome: obrigatório

Um nome exclusivo para o destino.

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. O caminho pode ser absoluto ou relativo ao método WORKSPACE.

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 o controle 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, para qualquer momento que esse repositório depende de "@foo" (como uma dependência do "@foo//some:target"), ele vai resolver essa dependência declarado globalmente: "@bar" ("@bar//some:target").

new_local_repository

Acessar a 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 projeto repositório pode definir e usar destinos de qualquer lugar no sistema de arquivos.

Essa regra cria um repositório Bazel ao criar um arquivo e subdiretório do WORKSPACE que contém links simbólicos para o arquivo BUILD e o caminho fornecidos. O arquivo de build deve criar destinos relativos à path: Para diretórios que já contêm um arquivo WORKSPACE e um arquivo BUILD, o local_repository pode ser usada.

Exemplos

Suponha que o repositório atual seja um cliente de chat, com raiz no diretório ~/chat-app. Ele quer 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) contendo:

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 criará um repositório @my-ssl com links simbólicos para /home/user/ssl. Os destinos podem depender dessa biblioteca adicionando @my-ssl//:openssl às dependências do destino.

Também é possível usar new_local_repository para incluir arquivos únicos, não apenas diretórios. Por exemplo, suponha que você tenha um arquivo jar em /home/username/Downloads/piano.jar. Você Você pode adicionar apenas esse arquivo ao build adicionando o seguinte ao arquivo WORKSPACE:

new_local_repository(
    name = "piano",
    path = "/home/username/Downloads/piano.jar",
    build_file = "BUILD.piano",
)

E criando o seguinte arquivo BUILD.piano:

java_import(
    name = "play-music",
    jars = ["piano.jar"],
    visibility = ["//visibility:public"],
)
Em seguida, os destinos podem depender de @piano//:play-music para usar o 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 o diretório.

O build_file ou o build_file_content precisa ser especificado.

Esse atributo é um rótulo relativo ao espaço de trabalho principal. O arquivo não precisa ser chamado de BUILD, mas pode ser. (Algo como BUILD.new-repo-name pode funcionar bem para diferenciando-o dos arquivos BUILD reais do repositório.)

build_file_content

String; o padrão é ""

O conteúdo do arquivo BUILD deste repositório.

É preciso especificar build_file ou build_file_content.

path

String; obrigatório

Um caminho no sistema de arquivos local.

Isso 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 o controle 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, para qualquer momento que esse repositório depende de "@foo" (como uma dependência do "@foo//some:target"), ele vai resolver essa dependência declarado globalmente: "@bar" ("@bar//some:target").

workspace_file

Nome: o padrão é None

O arquivo a ser usado como o arquivo de ESPAÇO DE TRABALHO 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 ser chamado WORKSPACE, mas pode ser. Algo como WORKSPACE.new-repo-name pode funcionar bem para diferenciá-lo dos arquivos WORKSPACE reais do repositório.

workspace_file_content

String; o padrão é ""

O conteúdo do arquivo WORKSPACE deste repositório.

O workspace_file ou workspace_file_content pode ser especificado, mas não ambos.