본문 바로가기
REZ/ADVACED

Ephemerals

by 르면가게 2024. 12. 24.

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의 이점

  1. 환경 정보 전달: 패키지에 옵션이나 설정을 전달하는 유연한 방법.
  2. 추상적 요구 사항 표현: 실제 패키지 없이 특정 조건이나 하드웨어 요구 사항 표현 가능.
  3. 유연성 향상: 환경 구성을 더 세밀하게 제어.

 

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