Rez Ephemerals 문서 요약
Rez의 Ephemerals(임시 패키지)는 실제로 존재하지 않는 패키지를 요청하는 기능으로, 환경 설정 시 정보를 전달하거나 추상적 요구 사항을 표현하는 데 사용됩니다.
Ephemerals의 개념
- Ephemeral 패키지는 항상 .으로 시작하는 이름을 가집니다(예: .foo-1).
- Rez는 이를 실제 패키지처럼 처리하며 종속성 충돌 및 범위 교차(intersection)를 계산합니다.
- 하지만, Ephemerals는 실제 패키지나 구성 단계(commands())와는 연결되지 않습니다.
예시:
rez-env .foo-1
출력:
.foo-1 (ephemeral)
Ephemerals의 특징
- 범위 교차:결과: .foo-1.5+로 범위가 교차된 패키지가 선택됨.
rez-env .foo-1 '.foo-1.5+
- 충돌 관리:결과: .foo-1과 .foo-2의 충돌로 인해 해결 실패.
rez-env .foo-1 .foo-2
Ephemeral 환경 변수
Ephemeral 패키지는 환경 변수로 설정된 정보를 제공합니다:
- REZ_USED_EPH_RESOLVE: 사용된 Ephemerals 목록.
- REZ_EPH_(PKG)_REQUEST: 특정 Ephemeral 요청의 세부 정보.
예시:
rez-env python .foo-1 .bah-2
echo $REZ_EPH_FOO_REQUEST # 출력: 1
echo $REZ_USED_EPH_RESOLVE # 출력: .foo-1 .bah-2
Ephemeral의 활용
(1) 패키지에 정보 전달
Ephemerals는 패키지 옵션처럼 사용되어 설정 정보를 전달할 수 있습니다.
예시:
name = 'bah'
def commands():
if intersects(ephemerals.get_range('bah.cli', '1'), '1'):
env.PATH.append('{root}/bin')
- .bah.cli-0: 명령줄 도구 비활성화.
- .bah.cli-1: 명령줄 도구 활성화.
- Boolean 값 사용 권장:
- 1: true.
- 0: false.
(2) 전역 패키지 옵션
Ephemeral을 전역 옵션으로 사용할 수도 있습니다.
예시:
name = 'bah'
def commands():
if intersects(ephemerals.get_range('cli', ''), 'bah'):
env.PATH.append('{root}/bin')
- .cli-foo|bah: foo와 bah의 명령줄 도구 활성화.
(3) 추상적 패키지 표현
Ephemerals는 추상적 객체나 조건을 표현하는 데 유용합니다.
예: GPU 지원 여부
name = 'pixxelator'
variants = [
['.gpu-0'], # CPU 렌더링
['.gpu-1'] # GPU 렌더링
]
- .gpu-1: GPU 지원.
- .gpu-0: GPU 미지원.
- GPU 설정 여부에 따라 변형이 선택됩니다.
주의:
- 모든 호스트에서 .gpu-0 또는 .gpu-1을 명시적으로 설정해야 불확실성을 방지할 수 있습니다.
결론: Ephemerals의 이점
- 환경 정보 전달: 패키지에 옵션이나 설정을 전달하는 유연한 방법.
- 추상적 요구 사항 표현: 실제 패키지 없이 특정 조건이나 하드웨어 요구 사항 표현 가능.
- 유연성 향상: 환경 구성을 더 세밀하게 제어.
intersects() & ephemerals.get_range()
ephemerals는 환경에서 해결된 일시적인(ephemeral) 항목들을 나타내는 객체로, 특정 패키지나 설정 값들이 포함된 딕셔너리와 유사한 구조를 가지고 있습니다. 이 객체는 각 항목이 문자열로 되어 있으며, 항목 이름은 패키지 이름을 기준으로 키가 설정됩니다. 예를 들어, .foo.cli-1과 같은 형식의 요청을 처리하는 항목이 포함됩니다.
주요 기능은 ephemerals.get_range() 메서드로, 이를 사용해 특정 항목의 버전 범위를 가져오고, intersects() 함수와 함께 사용하여 특정 범위 내에서의 교차 여부를 확인할 수 있습니다.
예시와 설명
1. ephemerals 객체의 구조
ephemerals 객체는 여러 패키지나 설정이 포함된 딕셔너리와 유사합니다. 예를 들어:
ephemerals = {
"foo.cli": ".foo.cli-1",
"bar.cli": ".bar.cli-0"
}
이때 ephemerals는 foo.cli와 bar.cli라는 두 가지 항목을 가지고 있습니다. 이 항목들은 각각 ".foo.cli-1", ".bar.cli-0"이라는 값을 가집니다.
2. get_range(name: str, range_: str) 메서드
get_range는 특정 이름(name)에 대한 버전 범위를 반환하는 메서드입니다. 예를 들어, foo.cli의 버전 범위를 가져오고 싶다면 ephemerals.get_range("foo.cli", "1")을 호출할 수 있습니다. 여기서 range_는 해당 항목에 대한 버전 범위를 나타내며, 이 예시에서는 "1"을 의미합니다.
ephemerals.get_range("foo.cli", "1") # VersionRange 형태로 반환됨
VersionRange는 특정 버전 범위를 나타내는 객체로, 이 값을 intersects()와 함께 사용하여 교차 여부를 확인할 수 있습니다.
3. intersects() 함수
intersects() 함수는 두 개의 범위가 겹치는지 확인하는 함수입니다. 예를 들어, ephemerals.get_range("foo.cli", "1")과 "1"을 비교할 때 사용됩니다. 만약 두 범위가 겹친다면 True를 반환하고, 그렇지 않으면 False를 반환합니다.
if intersects(ephemerals.get_range("foo.cli", "1"), "1"):
info("Enabling foo cli tools")
env.PATH.append("{root}/bin")
위 예시에서 intersects() 함수는 ephemerals.get_range("foo.cli", "1")와 "1"이 겹치는지를 확인합니다. 만약 겹친다면, foo.cli 툴이 활성화되며, env.PATH에 경로가 추가됩니다.
4. 사용 예시
ephemerals와 get_range 및 intersects를 사용하는 예시는 다음과 같습니다:
# foo.cli의 버전 범위가 1인 경우, foo.cli 도구를 활성화
if intersects(ephemerals.get_range("foo.cli", "1"), "1"):
info("Enabling foo cli tools")
env.PATH.append("{root}/bin")
이 코드는 foo.cli 항목의 버전 범위가 "1"과 겹칠 경우, foo.cli 도구를 활성화하고, env.PATH에 특정 경로를 추가하는 동작을 합니다. intersects()는 ephemerals.get_range()로 가져온 버전 범위와 "1"이 겹치는지를 판단하는 역할을 합니다.
결론
- ephemerals는 일시적인 항목을 다루는 딕셔너리와 유사한 객체입니다.
- get_range(name, range)는 특정 항목의 버전 범위를 반환하는 메서드입니다.
- intersects()는 두 범위가 교차하는지 확인하는 함수로, 주로 버전 범위를 비교할 때 사용됩니다.
'REZ > ADVACED' 카테고리의 다른 글
Pip (0) | 2024.12.24 |
---|---|
Resolve Caching (0) | 2024.12.24 |
Managing packages (0) | 2024.12.24 |
Suites (0) | 2024.12.24 |
Context bundles (0) | 2024.12.24 |