Bazel의 실험: 버전.txt
version.txt
인 git describe --always --dirty
파일을 만드는 데 유용한 규칙을 만들려고 합니다.g
, 접두사 dirty
와 같은 더 많은 정보를 제공할 것입니다. 제출하지 않은 변경 사항이 있다면.version.txt
를 다른 규칙의 입력으로 사용할 수 있으며 이 메타데이터를 구조에 포함시킬 수 있다.# commit previous changes then
❯ git describe --always --dirty
5472a43
# add the first annoted tag
❯ git tag -a "0.1.0" -m ":bookmark: 0.1.0"
❯ git describe --always --dirty
0.1.0
git 태그 버전: "v" 접두사 대신 주석이 있는 태그 사용하기
데이비드 버나드・ 3월 28일・ 4분 읽기
#git
현재 규칙을 만듭니다.
git describe
폴더 .git
의 내용에 접근해야 실행할 수 있으며,bazel은 명확하게 입력해야 하며, 입력 파일은 가방 아래에 있어야 합니다.따라서, 우리는 규칙을 ./BUILD.bazel
부모 폴더, 즉 작업 영역 루트 폴더에 만들 것입니다.genrule(
name = "version",
srcs = [".git"],
outs = ["version.txt"],
cmd_bash = "git --git-dir=$(location :.git) describe --always --dirty |tee $@",
)
❯ bazel build //:version
INFO: Analyzed target //:version (1 packages loaded, 2 targets configured).
INFO: Found 1 target...
WARNING: /home/david/src/github.com/davidB/sandbox_bazel/BUILD.bazel:1:8: input '.git' to //:version is a directory; dependency checking of directories is unsound
INFO: From Executing genrule //:version:
0.1.0-dirty
Target //:version up-to-date:
bazel-bin/version.txt
INFO: Elapsed time: 0.046s, Critical Path: 0.01s
INFO: 2 processes: 1 internal, 1 linux-sandbox.
INFO: Build completed successfully, 2 total actions
그러나 경고가 작용한 것 같다.이 코드를 제출하고bazel을 다시 실행합니다.❯ git add BUILD.bazel
❯ git commit -m ":alembic: create version.txt"
[development b5fea4c] :alembic: create version.txt
1 file changed, 6 insertions(+)
create mode 100644 BUILD.bazel
❯ git describe --always --dirty
0.1.0-1-gb5fea4c
❯ bazel build //:version
INFO: Analyzed target //:version (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //:version up-to-date:
bazel-bin/version.txt
INFO: Elapsed time: 0.029s, Critical Path: 0.00s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
: - (바젤은 변화를 감지하지 못했다.우리는 함수
.git
로 폴더의 모든 내용을 설명하는 것이지 glob
를 입력으로 설명하는 것이 아닙니다. 이것은 무엇입니까?genrule(
name = "version",
srcs = glob([".git/**"]),
outs = ["version.txt"],
cmd_bash = "git --git-dir=$(location :.git) describe --always --dirty |tee $@",
)
❯ bazel build //:version
ERROR: /home/david/src/github.com/davidB/sandbox_bazel/BUILD.bazel:1:8: in cmd_bash attribute of genrule rule //:version: label '//:.git' in $(location) expression is not a declared prerequisite of this rule
ERROR: Analysis of target '//:version' failed; build aborted: Analysis of target '//:version' failed
INFO: Elapsed time: 0.116s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (1 packages loaded, 111 targets configured)
빌어먹을 location
, 단일 파일이라면 .git
SRC에 포함되지 않습니다.또한 .git
폴더 아래의 파일만git 작업 디렉터리가 아니라 기호 링크이기 때문에, 이 명령은 작업 디렉터리를 항상 '더러움' 으로 검사합니다.이 경우, 우리는 Bazel에게 규칙을 모래상자에 실행하지 말고 local = True
(연습으로 복제 envinfo_local
를 통해 규칙 envinfo
을 만들고 조정하도록 요구해야 할 수도 있습니다.)genrule(
name = "version",
srcs = glob([".git/**"]),
outs = ["version.txt"],
cmd_bash = "git --git-dir=.git --no-pager describe --always --dirty |tee $@",
local = True,
)
테스트❯ bazel build //:version
INFO: Analyzed target //:version (1 packages loaded, 112 targets configured).
INFO: Found 1 target...
INFO: From Executing genrule //:version:
0.1.0-1-gb5fea4c-dirty
Target //:version up-to-date:
bazel-bin/version.txt
INFO: Elapsed time: 0.073s, Critical Path: 0.01s
INFO: 2 processes: 1 internal, 1 local.
INFO: Build completed successfully, 2 total actions
❯ git add BUILD.bazel
❯ git commit -m ":alembic: tune version"
❯ git describe --always --dirty
0.1.0-2-ge453fae
❯ bazel build //:version
INFO: Analyzed target //:version (1 packages loaded, 115 targets configured).
INFO: Found 1 target...
INFO: From Executing genrule //:version:
0.1.0-2-ge453fae-dirty
Target //:version up-to-date:
bazel-bin/version.txt
INFO: Elapsed time: 0.057s, Critical Path: 0.01s
INFO: 2 processes: 1 internal, 1 local.
INFO: Build completed successfully, 2 total actions
❯ git describe --always --dirty
0.1.0-2-ge453fae
이것은 더 좋은 것이지만, 우리가 예상치 못한 -dirty
일 때, 바젤을 통해 운행된다.cmd_bash
를 ls -al
이전에 git
로 수정하면git 명령을 실행하는 폴더는 항상 샌드박스입니다. 이 폴더를 가리키는 기호 링크 (없음local = True
보다 더 많은 기호 링크가 있지만 기호 링크와 다른 파일과 폴더가 있습니다.❯ bazel build //:version
INFO: Analyzed target //:version (1 packages loaded, 118 targets configured).
INFO: Found 1 target...
INFO: From Executing genrule //:version:
total 28
drwxr-xr-x 5 david david 4096 Mar 28 17:51 .
drwxr-xr-x 3 david david 4096 Mar 14 11:08 ..
lrwxrwxrwx 1 david david 61 Mar 28 17:51 .bazelversion -> /home/david/src/github.com/davidB/sandbox_bazel/.bazelversion
lrwxrwxrwx 1 david david 52 Mar 28 17:51 .git -> /home/david/src/github.com/davidB/sandbox_bazel/.git
lrwxrwxrwx 1 david david 55 Mar 28 17:51 .github -> /home/david/src/github.com/davidB/sandbox_bazel/.github
lrwxrwxrwx 1 david david 58 Mar 28 17:51 .gitignore -> /home/david/src/github.com/davidB/sandbox_bazel/.gitignore
lrwxrwxrwx 1 david david 59 Mar 28 17:51 BUILD.bazel -> /home/david/src/github.com/davidB/sandbox_bazel/BUILD.bazel
lrwxrwxrwx 1 david david 63 Mar 28 17:51 WORKSPACE.bazel -> /home/david/src/github.com/davidB/sandbox_bazel/WORKSPACE.bazel
drwxr-xr-x 5 david david 4096 Mar 28 17:51 bazel-out
lrwxrwxrwx 1 david david 59 Mar 28 17:51 exp_genrule -> /home/david/src/github.com/davidB/sandbox_bazel/exp_genrule
drwxr-xr-x 2 david david 4096 Mar 28 17:51 external
drwx------ 3 david david 4096 Mar 28 17:51 local-spawn-runner.1529500632871132789
0.1.0-2-ge453fae-dirty
Target //:version up-to-date:
bazel-bin/version.txt
INFO: Elapsed time: 0.098s, Critical Path: 0.01s
INFO: 2 processes: 1 internal, 1 local.
INFO: Build completed successfully, 2 total actions
아마도 다른 해결 방안을 찾을 때가 된 것 같다.우리는 로고--dirty
를 삭제할 수 있지만, 이것은 제출하지 않은 변경 사항이 잘못된 버전 정보를 가진 코드를 생성할 수 있고, 일부 신뢰를 이 정보에 소각하여 디버깅을 할 수 있다는 것을 의미한다.작업공간 상태
바셀 파일로 돌아가면 일부분을 찾을 수 있습니다Workspace status
Use these options to "stamp" Bazel-built binaries: to embed additional information into the binaries, such as the source control revision or other workspace-related information. You can use this mechanism with rules that support the stamp attribute, such as genrule, cc_binary, and more...
우리의 목표에 맞추기 위해서 한번 해 봅시다.디테일에 관해서는 왜...위에서 링크한 문서를 읽으십시오. 그러나 Bazel에 키/값 쌍을 만들어야 하는 스크립트를 제공할 수 있습니다.
STABLE_
로 시작하는 키는 파일 bazel-out/stable-status.txt
에 저장되고, 다른 것은 bazel-out/volatile-status.txt
에 저장됩니다.두 파일 모두 작업/규칙에 사용할 수 있습니다.stamp = True
의 변경 사항이 검출되면attribebazel-out/stable-status.txt
의 동작을 다시 터치합니다.# check if the files already exists
❯ cat bazel-out/stable-status.txt
BUILD_EMBED_LABEL
BUILD_HOST xxxxxxxxx
BUILD_USER david
❯ cat bazel-out/volatile-status.txt
BUILD_TIMESTAMP 1616946664
이 자습서의 나머지 부분과 마찬가지로 linux/macOs에만 한정된 bash 스크립트를workspace 상태tools/workspace_status.sh
로 사용합니다(실행 파일로 설정하는 것을 잊지 마세요).mkdir tools
touch tools/workspace_status.sh
chmod +x tools/workspace_status.sh
tools/workspace_status.sh
의 내용을 다음과 같이 정의합니다.#!/bin/bash
echo "STABLE_BUILD_GIT_DESCRIBE $(git --no-pager describe --always --dirty)"
도구를 사용하여 빠른 파일럿 및 시각 검사stable-status.txt
:❯ bazel build //:version --workspace_status_command "tools/workspace_status.sh"
INFO: Analyzed target //:version (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //:version up-to-date:
bazel-bin/version.txt
INFO: Elapsed time: 0.049s, Critical Path: 0.01s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
❯ cat bazel-out/stable-status.txt
BUILD_EMBED_LABEL
BUILD_HOST dwaynebox6
BUILD_USER david
STABLE_BUILD_GIT_DESCRIBE 0.1.0-2-ge453fae
버전 번호 -dirty
는 포함되지 않습니다.dirty 로고는 추적되지 않은 파일을 무시하기 때문입니다. 예를 들어 우리가 만든 새 파일 (완벽하지 않습니다.)따라서 버전 규칙을 수정하여
bazel-out/stable-status.txt
의 정보를 사용할 수 없습니다.genrule(
name = "version",
outs = ["version.txt"],
# alternative: "sed -n 's/STABLE_BUILD_GIT_DESCRIBE //p' bazel-out/stable-status.txt"
cmd_bash = "grep -Po '^STABLE_BUILD_GIT_DESCRIBE\\s+\\K.*' bazel-out/stable-status.txt |tee $@",
stamp = True,
)
❯ bazel build //:version --workspace_status_command "tools/workspace_status.sh"
INFO: Analyzed target //:version (1 packages loaded, 1 target configured).
INFO: Found 1 target...
INFO: From Executing genrule //:version:
0.1.0-2-ge453fae-dirty
Target //:version up-to-date:
bazel-bin/version.txt
INFO: Elapsed time: 0.079s, Critical Path: 0.02s
INFO: 2 processes: 1 internal, 1 linux-sandbox.
INFO: Build completed successfully, 2 total actions
변경 사항을 제출하지 않은 테스트를 진행하기 전에, 우리는 --workspace_status_command "tools/workspace_status.sh"
를 통해 각각 bazel build
호출에 레지스터.bazelrc
를 기본 표시로 추가할 것입니다.echo 'build --workspace_status_command "tools/workspace_status.sh"' >>.bazelrc
아니, 약속을 하고 더러운 것이 사라졌는지 테스트할 때가 됐어.❯ git add BUILD.bazel tools/* .bazelrc
❯ git commit -m ":recycle: rewrite version using workspace status"
❯ bazel build //:version
INFO: Analyzed target //:version (1 packages loaded, 1 target configured).
INFO: Found 1 target...
INFO: From Executing genrule //:version:
0.1.0-3-g95b84e9
Target //:version up-to-date:
bazel-bin/version.txt
INFO: Elapsed time: 0.087s, Critical Path: 0.02s
INFO: 2 processes: 1 internal, 1 linux-sandbox.
INFO: Build completed successfully, 2 total actions
🎉결론
이
version.txt
파일이 있으면 우리는 실제 프로젝트에서 사용할 수 있다. 이것은 긴 실험이다.우리는 genrule
에 대해 더 좋은 이해와 경험을 했고 local
와 stamp
속성을 발견했다.sandbox bazel은github에 위탁 관리됩니다. (오류로 인해 역사 기록이 다르기 때문에) tag를 사용하면 글 끝에 예상된 보기를 얻을 수 있습니다. article/3_versiontxt
Reference
이 문제에 관하여(Bazel의 실험: 버전.txt), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/davidb31/experimentations-on-bazel-version-txt-g1k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)