
개발을 하다보면 특정 라이브러리나 모듈을 설치해서 사용하던 중 충돌이 발생하는 경우가 있다.
이러한 충돌을 막기 위해 주로 가상 환경을 이용한다.
가상 환경의 일종인 rez란 무엇인지, 어떻게 활용되는지 알아보자.
소스 코드 개발에 사용되는 패키지 관리자의 일종. 만들어진 패키지를 기반으로 독립적인 개발 환경을 구축하기 위해 사용한다.
기존의 패키지 관리자의 경우 가상 환경을 먼저 만들고 해당 가상 환경 내에 패키지를 설치한다.
ex) Anaconda
이러한 방식은 간편하지만 가상 환경을 만들 때 수많은 라이브러리와 모듈이 함께 설치되기 때문에
가상 환경 자체가 무거워지고 패키지 간에 충돌이 발생하는 경우가 많아진다.
그러나 rez의 경우 중앙 저장소(REZ_PACKAGES_PATH)에 모든 패키지를 설치하고, 가상 환경을 실행할 때 필요한 패키지만 선택하여 호출하는 방식으로 작동한다.
이러한 방식은 가상 환경의 생성 속도를 빠르게 하고, 독립적으로 실행되게 한다.
다음은 기존 패키지 관리자와 rez의 작동 방식을 나타낸 그림이다.
기존 패키지 관리자:

rez:

rez의 Git Repository를 Clone하거나 최신 릴리즈를 다운로드한다.
]$ git clone https://github.com/AcademySoftwareFoundation/rez
다운로드한 디렉토리로 이동하여 install.py를 실행한다.
]$ python ./install.py
rez를 설치한 후에는 필수 패키지를 설치해야 한다. rez-bind를 통해 이미 설치된 소프트웨어를 참조하는 rez 패키지를 생성한다.
일반적으로는 --quickstart 옵션으로 표준 패키지를 바인딩한다.
rez 명령어를 인식하지 못할 경우 rez 실행 파일의 경로가 PATH 환경 변수에 추가되었는지 확인한다.export PATH="/path/to/rez":$PATH]$ rez-bind --quickstart
Binding platform into /home/username/packages...
Binding arch into /home/username/packages...
Binding os into /home/username/packages...
Binding python into /home/username/packages...
Binding rez into /home/username/packages...
Binding rezgui into /home/username/packages...
Binding setuptools into /home/username/packages...
Binding pip into /home/username/packages...
Successfully converted the following software found on the current system into Rez packages:
PACKAGE URI
------- ---
arch /home/username/packages/arch/x86_64/package.py
os /home/username/packages/os/osx-10.11.5/package.py
pip /home/username/packages/pip/8.0.2/package.py
platform /home/username/packages/platform/osx/package.py
python /home/username/packages/python/2.7.11/package.py
rez /home/username/packages/rez/2.0.rc1.44/package.py
rezgui /home/username/packages/rezgui/2.0.rc1.44/package.py
setuptools /home/username/packages/setuptools/19.4/package.py
정상적으로 바인딩이 종료된 경우 rez-env 명령어로 새로운 가상환경을 실행할 수 있다.
]$ rez-env python
You are now in a rez-configured environment.
resolved by west@localhost.localdomain, on Tue May 28 14:16:03 2024, using Rez v3.1.1
requested packages:
python
~platform==linux (implicit)
~arch==x86_64 (implicit)
~os==CentOS-7.9.2009 (implicit)
resolved packages:
arch-x86_64 /home/username/packages/arch/x86_64
os-CentOS-7.9.2009 /home/username/packages/os/CentOS-7.9.2009
platform-linux /home/username/packages/platform/linux
python-3.7.7
rez-build 명령어를 통해 사용자가 임의의 package.py로 패키지를 빌드할 수 있다.
package.py를 통해 특정 소프트웨어 혹은 모듈을 패키지에 포함시키거나, 환경변수를 추가하는 등의 작업을 할 수 있다.
-i 또는 --install 옵션을 통해 빌드된 패키지를 로컬에 설치한다.
-p 또는 --prefix 옵션을 통해 패키지를 특정 경로에 설치한다.
rez-build 명령어는 아래의 조건을 만족했을 때 유효하다.
rez-build 명령어를 실행하는 디렉토리에 package.py가 존재하는 경우cmake 도구가 사용 가능한 경우 (일반적으로 활성화 됨)]$ rez-build --install
--------------------------------------------------------------------------------
Building hello_world-1.0.0...
--------------------------------------------------------------------------------
Resolving build environment: python
resolved by username@workstation.local, on Tue May 28 14:16:03 2024, using Rez v3.1.1
requested packages:
python
~platform==osx (implicit)
~arch==x86_64 (implicit)
~os==osx-10.11.5 (implicit)
resolved packages:
arch-x86_64 /home/username/packages/arch/x86_64 (local)
os-osx-10.11.5 /home/username/packages/os/osx-10.11.5 (local)
platform-osx /home/username/packages/platform/osx (local)
python-3.7.7 /home/username/packages/python/3.7.7/platform-osx/arch-x86_64/os-osx-10.11.5 (local)
Invoking cmake build system...
Executing: /usr/local/bin/cmake -d /home/username/workspace/rez/example_packages/hello_world -Wno-dev -DCMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT=TRUE -D_ECLIPSE_VERSION=4.3 --no-warn-unused-cli -DCMAKE_INSTALL_PREFIX=/home/username/packages/hello_world/1.0.0 -DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH} -DCMAKE_BUILD_TYPE=Release -DREZ_BUILD_TYPE=local -DREZ_BUILD_INSTALL=1 -G Unix Makefiles
Not searching for unused variables given on the command line.
-- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/username/workspace/rez/example_packages/hello_world/build
Executing: make -j4
[100%] Built target py
Executing: make -j4 install
[100%] Built target py
Install the project...
-- Install configuration: "Release"
-- Installing: /home/username/packages/hello_world/1.0.0/./python/hello_world.py
-- Installing: /home/username/packages/hello_world/1.0.0/./python/hello_world.pyc
-- Installing: /home/username/packages/hello_world/1.0.0/./bin/hello
All 1 build(s) were successful.
package.py를 이용한 커스텀 패키지에 대해서는 다음 글에서 다루도록 하겠다.
성공적으로 빌드가 진행된 패키지는 rez-env를 통해 호출할 수 있다.
]$ rez-env hello_world
You are now in a rez-configured environment.
resolved by username@workstation.local, on Tue May 28 14:16:03 2024, using Rez v3.1.1
requested packages:
hello_world
~platform==osx (implicit)
~arch==x86_64 (implicit)
~os==osx-10.11.5 (implicit)
resolved packages:
arch-x86_64 /home/username/packages/arch/x86_64 (local)
hello_world-1.0.0 /home/username/packages/hello_world/1.0.0 (local)
os-osx-10.11.5 /home/username/packages/os/osx-10.11.5 (local)
platform-osx /home/username/packages/platform/osx (local)
python-3.7.7 /home/username/packages/python/3.7.7/platform-osx/arch-x86_64/os-osx-10.11.5 (local)
> ]$ █
rez-env 명령이 성공적으로 실행되면 프롬프트 앞에 > 표시가 나타난다.
해당 표시는 현재 쉘이 rez 환경 내에서 실행되고 있음을 알려주는 시각적 신호이다.
rez는 현재 환경을 업데이트하는 것이 아닌 하위 쉘을 구성하고 그 안에 사용자를 배치한다.
rez쉘 내에 있고 현재 사용 가능한 패키지의 목록을 다시 보고 싶다면 rez-context 명령어를 사용한다.
rez-env 명령어를 사용했을 때와 동일한 정보가 출력된다.
]$ rez-context
resolved by username@workstation.local, on Tue May 28 14:16:03 2024, using Rez v3.1.1
requested packages:
hello_world
~platform==osx (implicit)
~arch==x86_64 (implicit)
~os==osx-10.11.5 (implicit)
resolved packages:
arch-x86_64 /home/username/packages/arch/x86_64 (local)
hello_world-1.0.0 /home/username/packages/hello_world/1.0.0 (local)
os-osx-10.11.5 /home/username/packages/os/osx-10.11.5 (local)
platform-osx /home/username/packages/platform/osx (local)
python-3.7.7 /home/username/packages/python/3.7.7/platform-osx/arch-x86_64/os-osx-10.11.5 (local)
> ]$ █
구성된 환경의 종료는 exit 명령어를 입력하거나 Ctrl+D 단축키로 가능하다.
구성된 환경을 생성하고 일회성으로 명령을 실행하고 싶다면 rez-env로 가상 환경을 생성할 때
-- (명령어)를 추가하면 된다.
]$ rez-env hello_world -- hello
Hello world!
]$ █
이미지 출처: rez 3.1.1 documentation