ROS - setup.py & setup.cfg

남생이·2024년 10월 17일

ROS

목록 보기
27/28

1. setup.py

1.1 setup.py 기능

  • 빌드 관련 파일, CMakeList.txt와 package.xml의 기능을 하나로 묶어서 사용하는 파일
  • setuptools를 사용하여 패키지 배포 준비시 필요한 정보를 담고 있음
  • python 패키지에 대한 프로그래머틱한 구성 정보를 제공하며, setuptools를 통한 빌드 및 설치 과정에서 사용됨
  • python 패키지의 설치 스크립트
  • 주로 패키지 버전, 설명, 의존성 등이 정의
  • setuptools 라이브러리를 사용, 패키지를 빌드하고 설치하는데 필요한 설정 포함

프로그래매틱 접근

- python 스크립트 파일로, 패키지의 메타데이터의 설치 설정을 프로그래밍 방식으로 정의
- setuptools.setup() 함수 호출을 통해 이루어짐
- 패키지 이름, 버전, 의존성 등 다양한 인자를 동적으로 계산하거나 조건부 로직을 적용할 수 있는 높은 유연성


  • 직접 실행 가능
    - command:install,bdist_wheel,sdist 등 명령어
    - pip install로 설치하는 것을 권장
python setup.py <command>

  • 사용자 정의 명령 지원
    - 사용자가 필요에 따라 setuptools의 명령 확장 기능을 사용하여 새로운 명령어 정의 가능

1.2 setup.py 코드 분석

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_points
    : 커맨드 라인 스크립트를 자동으로 생성하도록 지시하는데 사용 --> 명령어 등록, 자동생성
setup(
    ...
    entry_points={
        'console_scripts': [
            'command_name = module_name:function_name',
        ],
    },
    ...
)


2. setup.cfg

2.1 setup.cfg 기능

  • 패키지 빌드/설치/배포를 위해 사용
  • setuptools를 사용하여 패키지 배포 준비시 필요한 정보를 담음
  • python 패키지에 대한 선언적인 구성 정보를 제공
  • setuptools를 통한 빌드 및 설치 과정에서 사용
  • 주로 패키지 버전, 설명 등이 여기에 정의

선언적 접근

- INI 포맷의 구성 파일, 패키지의 설정을 선언적으로 정의
- 패키지의 메타데이터와 옵션을 보다 단순하고 명확한 형식으로 지정
- setup.py보다 정적인 설정에 더 적합 but 조건부 로직이나 복잡한 계산을 포함할 수 없음


  • 간소화된 설정
    • setup.cfg 파일을 사용하여 패키지 설정을 최대한 간소화하는 추세
    • setup.py 파일을 최소화하거나 완전히 제거할 수 있도록 권장
    • 패키지의 구성이 읽기 쉽고 관리하기 쉬워짐

  • setup.py와의 결합 사용
    • setup.cfg를 사용하는 경우 setup.py가 필요할 수 있음
    • setuptools를 사용하여 패키지 빌드하는 명령어 실행시 setup.py파일이 사용됨
    • 대부분의 설정은 setup.cfg에서 관리

2.2 setup.cfg 코드 분석

[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]: 패키지 설치 시 스크립트가 위치할 경로 설정

3. setup.py VS setup.cfg

setup.pysetup.cfg
접근 방식프로그래밍 방식으로 패키지 설정을 제공선언적 방식으로 설정을 제공
유연성동적 계산과 사용자 정의 명령어를 지원함, 높은 유연성을 제공보다 간단하고 명확한 패키지 설정을 지향
사용 추세가능한 경우 setup.py 파일은 최소화하거나 제거현대의 Python 패키징은 setup.cfg를 통한 선언적 패키지 설정을 선호

ROS2에서의 역할

- 파이썬 기반의 ROS2 패키지에 대해 colcon --> setup.cfg, py를 사용하여 패키지의 설치 처리
- setup-tools를 통해 패키지 빌드 및 설치 방법에 대한 구성 정보를 제공
- ament_python 패키지 빌드 타입을 사용하는 경우, 파일의 설정이 빌드 과정에 영향을 줄 수 있음
profile
공부하는 거북이

0개의 댓글