다음은 확장 프로그램 작성과 관련된 몇 가지 일반적인 문제 및 질문입니다.
파일이 생성되지 않거나 작업이 실행되지 않는 이유는 무엇인가요?
Bazel은 요청된 출력 파일을 생성하는 데 필요한 작업만 실행합니다.
원하는 파일에 라벨이 있는 경우 직접 요청할 수 있습니다.
bazel build //pkg:myfile.txt
파일이 타겟의 출력 그룹에 있는 경우 명령줄에서 해당 출력 그룹을 지정해야 할 수 있습니다.
bazel build //pkg:mytarget --output_groups=foo
명령줄에서 타겟이 언급될 때마다 파일이 자동으로 빌드되도록 하려면
DefaultInfo
제공자를 반환하여 규칙의 기본 출력에 추가합니다.
자세한 내용은 규칙 페이지를 참고하세요.
구현 함수가 실행되지 않는 이유는 무엇인가요?
Bazel은 빌드에 요청된 타겟만 분석합니다. 명령줄에서 타겟의 이름을 지정하거나 타겟에 종속된 항목의 이름을 지정해야 합니다.
작업 또는 바이너리가 실행될 때 파일이 누락됨
1) 파일이 작업 또는 바이너리의 입력으로 등록되었는지, 2) 실행 중인 스크립트 또는 도구가 올바른 경로를 사용하여 파일에 액세스하는지 확인합니다.
작업의 경우 작업을 만드는 ctx.actions.*
함수에 입력을 전달하여 입력을 선언합니다. File.path
를 사용하여 파일의 올바른 경로를 가져올 수 있습니다.
바이너리 (bazel run
또는 bazel test
명령어로 실행되는 실행 파일 출력)의 경우 runfiles에 입력을 포함하여 선언합니다. path
필드를 사용하는 대신 바이너리가 실행되는 runfiles 디렉터리에 상대적인 파일 경로인 File.short_path
를 사용합니다.
bazel build //pkg:mytarget
에서 빌드되는 파일을 제어하려면 어떻게 해야 하나요?
DefaultInfo
제공자를 사용하여 기본 출력을 설정합니다.
빌드의 일부로 프로그램을 실행하거나 파일 I/O를 실행하려면 어떻게 해야 하나요?
도구는 빌드의 다른 부분과 마찬가지로 대상으로 선언할 수 있으며 실행 단계 중에 실행하여 다른 대상을 빌드하는 데 도움을 줄 수 있습니다. 도구를 실행하는 작업을 만들려면 ctx.actions.run
를 사용하고 도구를 executable
매개변수로 전달합니다.
로드 및 분석 단계에서는 도구를 실행할 수 없으며 파일 I/O를 실행할 수도 없습니다. 즉, 도구 및 파일 콘텐츠 (BUILD 및 .bzl 파일의 콘텐츠 제외)는 타겟 및 작업 그래프가 생성되는 방식에 영향을 줄 수 없습니다.
실행 단계 전과 도중에 동일한 구조화된 데이터에 액세스해야 한다면 어떻게 해야 하나요?
구조화된 데이터의 형식을 .bzl 파일로 지정할 수 있습니다. 파일을 load()
하여 로드 및 분석 단계에서 액세스할 수 있습니다. 실행 단계에서 필요한 작업 및 실행 파일에 입력 또는 runfile로 전달할 수 있습니다.
Starlark 코드는 어떻게 문서화해야 하나요?
규칙 및 규칙 속성의 경우 docstring 리터럴 (일부 문자열은 삼중 따옴표로 묶음)을 rule
또는 attr.*()
의 doc
매개변수에 전달할 수 있습니다. 도우미 함수와 매크로의 경우 여기에 나온 형식에 따라 삼중 따옴표 드문드문 구두 설명 리터럴을 사용합니다.
규칙 구현 함수에는 일반적으로 자체 문서 문자열이 필요하지 않습니다.
예상되는 위치에 문자열 리터럴을 사용하면 자동 도구에서 문서를 더 쉽게 추출할 수 있습니다. 코드 리더에게 도움이 되는 곳이면 어디서나 표준 비문자열 주석을 자유롭게 사용하세요.