rez 패키지 빌드하기

td.junopark·2024년 5월 31일

rez 가상 환경 구축

목록 보기
2/2
post-thumbnail

rez를 사용해 환경을 구성할 때, 특정 패키지 안에 모듈이나 소프트웨어를 추가하고 환경 변수를 관리하는 방법에 대해 알아보자.

목차

rez 패키지란?

rez-build 명령어의 패키지 빌드는 일반적으로 package.py와 이에 의해 호출되는 파일에 의해 이루어진다.
rez-env 명령어로 환경이 구성될 때 호출되는 패키지에 의해 각종 환경 변수와 모듈, 소프트웨어 등을 해당 환경에 포함하게 한다.

다음은 package.py의 예시이다.

name = "my_pyside2_package"
version = "1.0.0"
description = "A sample package that includes PySide2."
authors = ["Your Name"]
requires = ["python-3.7+", "pyside2"]

build_command = "python {root}/build.py"

def commands():
    env.PYTHONPATH.append("{root}/python")
    # 추가적인 환경 변수 설정이 필요할 경우 여기에 추가할 수 있습니다.

rez 패키지의 속성

다음은 위의 예시에서 사용된 package.py에서 사용자가 직접 정의할 수 있는 속성들이다.
패키지 속성에 대한 자세한 내용은 여기에서 확인할 수 있다.

  • name: str

    • 패키지의 이름
    • 영문과 숫자, 밑줄을 인식하며 대소문자를 구분함
    name = "my_pyside2_package"
  • version: str

    • 패키지의 버전
    • 자세한 정보는 여기
    version = "1.0.0"
  • description: str

    • 패키지에 대한 설명
    • 패키지의 특정 버전에 대한 세부 정보를 언급해서는 안 됨
    description = "A sample package that includes PySide2."
  • author: list[str]

    • 패키지 작성자, 기여자 등의 이름
    authors = ["Your Name"]
  • requires: list[str]

    • 이 패키지가 의존하는 다른 패키지의 목록
    • 필요한 모든 패키지가 포함되어야 하며, 종속성을 가진 패키지도 포함
    • +, <등을 이용해 버전을 다양하게 설정할 수 있다
    requires = ["python-3.7+", "pyside2"]
  • build_command: str

    • 패키지 빌드 시 실행되는 명령어
    • 소스 파일을 컴파일 하거나 필요한 파일을 적절한 위치로 복사하는 등의 작업을 한다
    • {root}package.py가 존재하는 디렉토리의 경로이다
    build_command = "python {root}/build.py"
    
  • commands() -> None

    • 패키지를 사용할 수 있도록 환경을 구성하는 코드 블록
    • 패키지가 rez환경으로 전환될 때 실행됨
    • 각종 환경변수를 설정, 해제 혹은 추가하거나 별칭을 설정할 수 있음
    • 스크립트를 불러올 수 있음
    def commands():
      env.PYTHONPATH.append("{root}/python")
      env.PATH.prepend("{root}/bin")
      # 추가적인 환경 변수 설정이 필요할 경우 여기에 추가할 수 있습니다.

rez 패키지 빌드하기

package.py와 그에 의해 호출되는 build.py를 통해 ffmpeg 프레임워크를 포함한 패키지를 구성해보자.

package.py

"ffmpeg" 패키지에서 파이썬 3.7.x 버전을 사용하도록 "python-3.7"requires에 추가했고,
build.py에서 패키지 경로에 복사 될 ffmpeg를 사용할 수 있도록 PATH 환경변수를 추가했다.

또한 python3로 build.py를 실행하기 위해 build_command에 해당 명령어를 작성했다.

# package.py

name = "ffmpeg"
version = "1.0.0"
description = "env for ffmpeg framework and python3"
authors = ["username"]
requires = ["python-3.7"]

build_command = "python3 {root}/build.py"

def commands():
    env.PATH.append("/home/username/packages/ffmpeg/1.0.0")

build.py

build.py에서는 ffmpeg를 특정 경로에 다운로드 및 압축을 해제하여 패키지로 복사하는 작업을 하도록 했다.

# build.py

import os

def get_ffmpeg()
	tar_path = "/home/username/Downloads/ffmpeg-4.2.4.tar.xz"
	extracted_tar = "/home/username/Downloads/ffmpeg-4.2.4"
	save_path = "/home/username/Downloads"
	ffmpeg_path = "/home/username/packages/ffmpeg/1.0.0/ffmpeg"

	if not os.path.exists(save_path):
	    os.makedirs(save_path)

	if not os.path.exists(ffmpeg_path):
    
	    if not os.path.exists(tar_path):
	    	# ffmpeg-4.2.4를 특정 경로에 다운로드
	        os.system(f"wget https://ffmpeg.org/releases/ffmpeg-4.2.4.tar.xz -P /home/username/Downloads")

	    if not os.path.exists(extracted_tar):
	    	# 파일 압축 해제
	        os.system(f"cd /home/username/Downloads && tar -xf {tar_path}")
	
	    # ffmpeg 파일을 패키지로 복사
	    os.system(f"cd {extracted_tar} && cp ./ffmpeg /home/username/packages/ffmpeg/1.0.0")
	else:
		# ffmpeg가 이미 존재하는 경우 pass
	    print("ffmpeg already exists")
	    pass
        
get_ffmpeg()

rez-build --install

작성이 완료된 packge.pybuild.py가 존재하는 디렉토리에서 rez-build --install 명령어를 실행하여 패키지를 로컬에 설치한다.
-p PATH 또는 --prefix PATH 옵션으로 패키지가 설치될 경로를 지정할 수도 있다.

]$ rez-build --install
================================================================================
Building ffmpeg-1.0.0...
================================================================================
Resolving build environment: python
resolved by username@workstation.local, on Fri May 31 14:07:38 2024, using Rez v3.1.1

requested packages:
python            
~platform==linux  (implicit)
~arch==x86_64     (implicit)
~os==rocky-9.4    (implicit)

resolved packages:
arch-x86_64     /RAPA/packages/arch/x86_64
os-rocky-9.4    /RAPA/packages/os/rocky-9.4
platform-linux  /RAPA/packages/platform/linux
python-3.9.18   /RAPA/packages/python/3.9.18/platform-linux/arch-x86_64/os-rocky-9.4

Invoking custom build system...
Running build command: python /home/username/builder/ffmpeg/build.py install 
python /home/username/builder/ffmpeg/build.py

================================================================================
Build Summary
================================================================================

All 1 build(s) were successful.

rez 패키지 테스트

rez-build로 설치된 패키지를 rez환경으로 전환하여 ffmpeg를 정상적으로 불러오는지 확인해보자.

]$ rez-env ffmpeg

You are now in a rez-configured environment.

resolved by username@workstation.local, on Fri May 31 14:12:42 2024, using Rez v3.1.1

requested packages:
ffmpeg            
~platform==linux  (implicit)
~arch==x86_64     (implicit)
~os==rocky-9.4    (implicit)

resolved packages:
arch-x86_64     /home/username/packages/arch/x86_64                                            
ffmpeg-1.0.0    /home/username/packages/ffmpeg/1.0.0                                           
os-rocky-9.4    /home/username/packages/os/rocky-9.4                                           
platform-linux  /home/username/packages/platform/linux                                         
python-3.9.18   /home/username/packages/python/3.9.18/platform-linux/arch-x86_64/os-rocky-9.4  
> ]$ which ffmpeg
/home/username/packages/ffmpeg/1.0.0/ffmpeg

패키지 내부의 ffmpeg를 정상적으로 인식한 것을 알 수 있다.
이처럼 사용자가 자유롭게 패키지를 구성 및 수정할 수 있는 것이 rez의 장점 중 하나이다.

이미지 출처: rez 3.1.1 documentation

profile
공부 중🙄

0개의 댓글