Workspace 규칙

문제 신고하기 소스 보기

작업공간 규칙은 일반적으로 기본 저장소 외부에 위치한 소스 코드인 외부 종속 항목을 가져오는 데 사용됩니다.

참고: Bazel은 기본 작업공간 규칙 외에도 다양한 Starlark 작업공간 규칙(특히 웹에서 호스팅되는 git 저장소 또는 보관 파일을 처리하는 규칙)을 삽입합니다.

규칙

bind

규칙 소스 보기
bind(name, actual, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

경고: bind() 사용은 권장하지 않습니다. 문제 및 대안에 관한 자세한 설명은 '바인드 삭제 고려'를 참고하세요. 특히 repo_mapping 저장소 속성의 사용을 고려하세요.

경고: select()bind()에서 사용할 수 없습니다. 자세한 내용은 구성 가능한 속성 FAQ를 참고하세요.

//external 패키지의 타겟에 별칭을 제공합니다.

//external 패키지는 '일반' 패키지가 아닙니다. external/ 디렉터리가 없으므로 바인딩된 모든 타겟을 포함하는 '가상 패키지'라고 생각하면 됩니다.

대상에 별칭을 지정하려면 WORKSPACE 파일에서 bind합니다. 예를 들어 //third_party/javacc-v2라는 java_library 타겟이 있다고 가정해 보겠습니다. WORKSPACE 파일에 다음을 추가하여 별칭을 지정할 수 있습니다.

bind(
    name = "javacc-latest",
    actual = "//third_party/javacc-v2",
)

이제 대상이 //third_party/javacc-v2 대신 //external:javacc-latest에 종속될 수 있습니다. javacc-v3이 출시되면 bind 규칙을 업데이트할 수 있고 //external:javacc-latest에 종속되는 모든 BUILD 파일은 이제 수정할 필요 없이 javacc-v3에 종속됩니다.

Bind를 사용하면 외부 저장소의 대상을 작업공간에서 사용할 수 있습니다. 예를 들어 WORKSPACE 파일에 가져온 @my-ssl라는 원격 저장소가 있고 cc_library 대상 //src:openssl-lib가 있는 경우 bind를 사용하여 이 대상의 별칭을 만들 수 있습니다.

bind(
    name = "openssl",
    actual = "@my-ssl//src:openssl-lib",
)

그런 다음 작업공간의 BUILD 파일에서 바인드된 대상을 다음과 같이 사용할 수 있습니다.

cc_library(
    name = "sign-in",
    srcs = ["sign_in.cc"],
    hdrs = ["sign_in.h"],
    deps = ["//external:openssl"],
)

sign_in.ccsign_in.h 내에서 //external:openssl에 의해 노출된 헤더 파일은 저장소 루트에 상대적인 경로를 사용하여 참조할 수 있습니다. 예를 들어 @my-ssl//src:openssl-lib에 대한 규칙 정의가 다음과 같다면

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

그러면 sign_in.cc의 include는 다음과 같을 수 있습니다.

#include "sign_in.h"
#include "src/openssl.h"

인수

특성
name

이름. 필수 항목입니다.

이 대상의 고유한 이름입니다.

actual

라벨. 기본값은 None입니다.

별칭을 지정할 대상입니다.

이 대상은 반드시 있어야 하지만 바인드를 비롯한 모든 유형의 규칙일 수 있습니다.

이 속성이 생략되면 //external에서 이 타겟을 참조하는 규칙은 이 종속 항목 에지를 보지 못합니다. 이는 bind 규칙을 완전히 생략하는 것과는 다릅니다. //external 종속 항목에 연결된 bind 규칙이 없으면 오류가 발생합니다.

local_repository

규칙 소스 보기
local_repository(name, path, repo_mapping)

로컬 디렉터리의 대상을 바인딩할 수 있습니다. 즉, 현재 저장소는 이 다른 디렉터리에 정의된 타겟을 사용할 수 있습니다. 자세한 내용은 바인드 섹션을 참고하세요.

현재 저장소가 ~/chat-app 디렉터리에 루팅된 채팅 클라이언트라고 가정해 보겠습니다. 다른 저장소(~/ssl)에 정의된 SSL 라이브러리를 사용하려고 합니다. SSL 라이브러리에는 타겟 //src:openssl-lib가 있습니다.

사용자는 ~/chat-app/WORKSPACE에 다음 줄을 추가하여 이 대상에 종속 항목을 추가할 수 있습니다.

local_repository(
    name = "my-ssl",
    path = "/home/user/ssl",
)

대상은 이 라이브러리에 종속될 종속 항목으로 @my-ssl//src:openssl-lib를 지정합니다.

인수

특성
name

이름. 필수 항목입니다.

이 대상의 고유한 이름입니다.

path

문자열, 필수

로컬 저장소의 디렉터리 경로입니다.

저장소의 WORKSPACE 파일이 포함된 디렉터리의 경로여야 합니다. 경로는 기본 저장소의 WORKSPACE 파일에 대해 절대적이거나 상대적일 수 있습니다.

repo_mapping

사전: 문자열 -> 문자열. 기본값은 {}입니다.

로컬 저장소 이름에서 전역 저장소 이름으로의 사전입니다. 이렇게 하면 이 저장소의 종속 항목에 대한 작업공간 종속 항목 해결을 제어할 수 있습니다.

예를 들어 "@foo": "@bar" 항목은 이 저장소가 "@foo"에 종속될 때마다 (예: "@foo//some:target"의 종속 항목) 실제로 전역적으로 선언된 "@bar" ("@bar//some:target") 내에서 종속 항목을 해결해야 한다고 선언합니다.

new_local_repository

규칙 소스 보기
new_local_repository(name, build_file, build_file_content, path, repo_mapping, workspace_file, workspace_file_content)

로컬 디렉터리를 Bazel 저장소로 변환할 수 있습니다. 즉, 현재 저장소는 파일 시스템의 모든 위치에 있는 대상을 정의하고 사용할 수 있습니다.

이 규칙은 BUILD 파일 및 지정된 경로에 대한 심볼릭 링크가 포함된 WORKSPACE 파일과 하위 디렉터리를 만들어 Bazel 저장소를 만듭니다. 빌드 파일은 path에 상대적인 타겟을 생성해야 합니다. 이미 WORKSPACE 파일과 BUILD 파일이 포함된 디렉터리의 경우 local_repository 규칙을 사용할 수 있습니다.

현재 저장소가 ~/chat-app 디렉터리에 루팅된 채팅 클라이언트라고 가정해 보겠습니다. 이 저장소는 다른 디렉터리(~/ssl)에 정의된 SSL 라이브러리를 사용하려고 합니다.

사용자는 다음을 포함하는 SSL 라이브러리(~/chat-app/BUILD.my-ssl)의 BUILD 파일을 만들어 종속 항목을 추가할 수 있습니다.

java_library(
    name = "openssl",
    srcs = glob(['*.java'])
    visibility = ["//visibility:public"],
)

그리고 다음 줄을 ~/chat-app/WORKSPACE에 추가하면 됩니다.

new_local_repository(
    name = "my-ssl",
    path = "/home/user/ssl",
    build_file = "BUILD.my-ssl",
)

이렇게 하면 /home/user/ssl에 심볼릭 링크로 연결되는 @my-ssl 저장소가 생성됩니다. 타겟은 타겟의 종속 항목에 @my-ssl//:openssl를 추가하여 이 라이브러리에 종속될 수 있습니다.

new_local_repository를 사용하여 디렉터리뿐만 아니라 단일 파일을 포함할 수도 있습니다. 예를 들어 /home/username/Downloads/piano.jar에 jar 파일이 있다고 가정해 보겠습니다. WORKSPACE 파일에 다음을 추가하여 이 파일만 빌드에 추가할 수 있습니다.

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

다음 BUILD.piano 파일을 만듭니다.

java_import(
    name = "play-music",
    jars = ["piano.jar"],
    visibility = ["//visibility:public"],
)
그러면 타겟이 @piano//:play-music에 종속되어 piano.jar를 사용할 수 있습니다.

인수

특성
name

이름. 필수 항목입니다.

이 대상의 고유한 이름입니다.

build_file

이름. 기본값은 None입니다.

이 디렉터리의 BUILD 파일로 사용할 파일입니다.

build_file 또는 build_file_content를 지정해야 합니다.

이 속성은 기본 작업공간을 기준으로 한 라벨입니다. 파일 이름을 BUILD로 지정할 필요는 없지만 지정할 수 있습니다. (BUILD.new-repo-name과 같은 것이 저장소의 실제 BUILD 파일과 구분되는 데 적합할 수 있습니다.)

build_file_content

문자열. 기본값은 ""입니다.

이 저장소에 대한 BUILD 파일의 콘텐츠.

build_file 또는 build_file_content를 지정해야 합니다.

path

문자열, 필수

로컬 파일 시스템의 경로입니다.

절대적 또는 기본 저장소의 WORKSPACE 파일에 대해 상대적일 수 있습니다.

repo_mapping

사전: 문자열 -> 문자열. 기본값은 {}입니다.

로컬 저장소 이름에서 전역 저장소 이름으로의 사전입니다. 이렇게 하면 이 저장소의 종속 항목에 대한 작업공간 종속 항목 해결을 제어할 수 있습니다.

예를 들어 "@foo": "@bar" 항목은 이 저장소가 "@foo"에 종속될 때마다 (예: "@foo//some:target"의 종속 항목) 실제로 전역적으로 선언된 "@bar" ("@bar//some:target") 내에서 종속 항목을 해결해야 한다고 선언합니다.

workspace_file

이름. 기본값은 None입니다.

이 저장소의 WORKSPACE 파일로 사용할 파일입니다.

workspace_file 또는 workspace_file_content 중 하나를 지정할 수 있지만 둘 다 지정할 수는 없습니다.

이 속성은 기본 작업공간을 기준으로 한 라벨입니다. 파일 이름을 WORKSPACE로 지정할 필요는 없지만 그렇게 할 수 있습니다. WORKSPACE.new-repo-name과 같은 것이 저장소의 실제 WORKSPACE 파일과 구별하는 데 적합할 수 있습니다.

workspace_file_content

문자열. 기본값은 ""입니다.

이 저장소에 대한 WORKSPACE 파일의 콘텐츠입니다.

workspace_file 또는 workspace_file_content 중 하나를 지정할 수 있지만 둘 다 지정할 수는 없습니다.