프로그래매틱 접근
- python 스크립트 파일로, 패키지의 메타데이터의 설치 설정을 프로그래밍 방식으로 정의
- setuptools.setup() 함수 호출을 통해 이루어짐
- 패키지 이름, 버전, 의존성 등 다양한 인자를 동적으로 계산하거나 조건부 로직을 적용할 수 있는 높은 유연성
python setup.py <command>
rom setuptools import find_packages, setup
package_name = 'ros_study'
setup(
name=package_name, # package name
version='0.0.0', # package version
packages=find_packages(exclude=['test']), # 의존 패키지 탐색, find_package() 기입하면 자동 탐색하므로 수정하지 않기
# exclude=[]: 찾고자 하는 패키지에서 제외할 디렉토리의 이름 지정, test는 실제 패키지와는 무관
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
# package에서 사용하는 파일을 기입한다. ROS에서는 주로 resource 폴더 내에 있는 ament_index를
# 위한 패키지의 이름의 빈 파일이나 package.xml, *.launch.py, *.yaml 등을 기입한다.
install_requires=['setuptools'],
# 의존하는 패키지, 이 패키지를 pip을 통해 설치할 때 이곳에 기술된 패키지들을 함께 설치하게 된다.
# ROS에서는 pip로 설치하지 않기에 setuptools, launch만을 기입한다.
zip_safe=True,
# 설치시 zip파일로 아카이브 할지 여부
maintainer='namsang',
maintainer_email='namsang@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
],
},
# 엔트리 포인트, 콘솔 프크립트를 설치하도록 콘솔 스크립트 이름과 호출 함수를 기입한다.
# 여기 적히면 cmd에서 명령을 내릴 수 있다.
)
maintainer ~ license : package.xml 파일과 동일하게 작성entry_pointssetup(
...
entry_points={
'console_scripts': [
'command_name = module_name:function_name',
],
},
...
)
선언적 접근
- INI 포맷의 구성 파일, 패키지의 설정을 선언적으로 정의
- 패키지의 메타데이터와 옵션을 보다 단순하고 명확한 형식으로 지정
- setup.py보다 정적인 설정에 더 적합 but 조건부 로직이나 복잡한 계산을 포함할 수 없음
[metadata]
name = my_ros_pkg
version = 0.1
description = My ROS package
author = Your Name
author_email = your_email@example.com
[options]
packages = find:
install_requires =
some_dependency
[develop]
script_dir=$base/lib/<pkg_name>
[install]
install_scripts=$base/lib/<pkg_name>
[metadata]: 메타데이터 작성, 로컬 개발 환경에서는 필수적이지 않음[options]: 패키지의 설치 옵션을 정의, 다른 패키지에 의존하지 않거나 모듈 탐색이 없는 경우 생략 가능[develop]: 개발 모드에서 스크립트의 위치를 설정[install]: 패키지 설치 시 스크립트가 위치할 경로 설정| setup.py | setup.cfg | |
|---|---|---|
| 접근 방식 | 프로그래밍 방식으로 패키지 설정을 제공 | 선언적 방식으로 설정을 제공 |
| 유연성 | 동적 계산과 사용자 정의 명령어를 지원함, 높은 유연성을 제공 | 보다 간단하고 명확한 패키지 설정을 지향 |
| 사용 추세 | 가능한 경우 setup.py 파일은 최소화하거나 제거 | 현대의 Python 패키징은 setup.cfg를 통한 선언적 패키지 설정을 선호 |
ROS2에서의 역할
- 파이썬 기반의 ROS2 패키지에 대해 colcon --> setup.cfg, py를 사용하여 패키지의 설치 처리
- setup-tools를 통해 패키지 빌드 및 설치 방법에 대한 구성 정보를 제공
- ament_python 패키지 빌드 타입을 사용하는 경우, 파일의 설정이 빌드 과정에 영향을 줄 수 있음