프로젝트를 시로 옮기다

13557 단어 pythonpackagingpoetry

Poetry는 Python 패키지 문제를 해결하는 도구입니다.그것은 Sé bastien Eustace(또는 pendulum의 저자)가 2018년 2월에 창립했다.그것은 아름다운 사이트와 웅대한 제목을 가지고 있다.

Python packaging and dependency management made easy


그것은 이미 나의 레이더에 한동안 있었지만, 나는 지금까지 그것에게 적당한 시도를 한 적이 없다.나는 매우 기쁘게 pip-tools를 사용했다. 이것은 나의 주요 용례를 해결했고 동시에 더욱 경량급이다. 이것은 내가 계속 pip를 사용할 수 있다는 것을 의미한다. 왜냐하면 그의 출력은 매우 좋은 오래된 버전이기 때문이다requirements.txt.나는 인터넷에서 몇 번 들은 적이 있는데, 자주 Pipenv 옆에 있지만, 최근에는 시가 더욱 큰 매력을 가진 것 같다.
몇 주 전, 내 수중에 시간이 좀 있어서, 나는 그것을 잘 보기로 결정했다. 아마도 나의 프로젝트 Deezer Python 를 이전할 수 있을 것이다.

시작점


마이그레이션 전에 패키지를 관리하는 방법:
  • 프로젝트 메타데이터는 setup.cfg에 위치하고 사용setuptools declarative config.
  • 개발(및 문서) 의존항은 pip-tools 관리한다.
  • RTD(Read the Docs)에서 관리되는 문서입니다.
  • 는 Github의 (PSR) 작업을 통해 자동으로 게시됩니다.
  • setup.cfg에 설정된 개발 도구(black, isort, pyupgrade,flake8).
  • 사용 tox 로컬 테스트 도움말.
  • CI에 Github 작업을 사용합니다.
  • 이것은 시가로 옮긴 후 영향을 받은 몇 가지 특징으로 나는 상하문에서 언급할 가치가 있다고 생각한다.Poetry 사용pyproject.toml 때문에 모든 도구 구성을 setup.cfg 에서 파일로 이동하고 싶습니다.

    Python 의미 발표 옮기다


    시가 설치


    첫 번째 단계는 CLI를 가져오는 것입니다.나는 처음에 자체 제작 소프트웨어를 통해 설치했지만, 나중에 Poetry가 설치에 사용된 Python 버전에 따라 기본값을 설정했다는 것을 깨달았다.자체 제작 Python은 알림 없이 업데이트할 수 있기 때문에 이것은 최선의 선택이 아니라는 것을 깨달았기 때문에 저는 나중에 pipxpyenv가 관리하는 Python 설치를 통해 다시 설치했습니다. 제가 모르는 상황에서 삭제되지 않을 것입니다.
    pipx install \
     --python ~/.pyenv/versions/3.8.6/bin/python \
     poetry
    

    프로젝트 메타데이터


    첫 번째 단계는 프로젝트 메타데이터를 setup.cfg 에서 pyproject.toml 로 이전하는 것이다.Poetry에는 가장 작은 poetry init 명령을 만들 수 있는 편리한 상호작용 명령이 포함되어 있습니다.나는 이미 약간의 서프라이즈를 알아차렸다.
  • CLI와 상호 작용 가능
  • pyproject.tomlauthorauthor_email의수조로 합쳐지고 각 수조의 형식은 setup.cfg이다.
  • 그리고 나서 나는 계속해서 수동으로 더 많은 설정을 새로운 형식으로 바꾸었는데, 이 과정은 상당히 수월했다.많은 설정들은 같은 명칭과 값을 가지고 있는데, 그것이 같지 않을 때, 주로 일을 간소화하기 위해서이다.setuptools 같은 라이브러리는 뒤로 호환되기 때문에 쉽게 실현할 수 없는 것 같지만, Poetry 같은 새로운 선택 가입 도구는 이 점을 할 수 있다.

    의존항


    의존항을 추가하고 개발하는 것은 매우 간단합니다. 마지막 실행authors과 패키지 목록만 있으면 됩니다.
    이 과정에서 나는 개발 의존항 을 발견했다. Poetry는 내가 자신의 Python을 Full Name <[email protected]>로 설정하는 것을 허락하지 않는다.처음에 나는 최저 버전poetry add [-D] ...을 빠른 복구로 변경했지만, 나중에 나는 그것이 나의 가방의 트로이 분류기, 즉 시에서 생성된 분류기에 영향을 미쳤다는 것을 깨달았다. 나의 가방은Python 3.6과 호환되지 않았다.개발 의존을 위한 것이기 때문에 더 좋은 방법이 있다!수정 방법은 Python 버전에 종속되는 조건을 지정하는 것입니다.
    [tool.poetry.dependencies]
    python = "^3.6"
    ...
    
    [tool.poetry.dev-dependencies]
    ...
    pyupgrade = { version = "^2.7.3", python = "^3.6.1" }
    
    따라서 내 가방과 분류기의 최저 Python 버전은 정확하다.

    pyupgrade는 Python 3.6.0과 호환되지 않음 추가 의존 항목


    이 가방에는 "추가require"의존 항목이 있습니다.좋은 가 있습니다. 이 의존항들은 정상적인 의존항과 같은 절에서 지정해야 하지만 ^3.6:
    [tool.poetry.dependencies]
    ...
    tornado = {version = "^6.0.4", optional = true}
    
    전용 ^3.6.1 섹션이 선택적 종속 항목에 추가로 매핑됩니다.
    [tool.poetry.extras]
    tornado = ["tornado"]
    
    처음에 나는 매우 곤혹스러웠다. 왜냐하면 이것은 optional 명령을 통해 완성된 것이라고 생각했기 때문이다.그러나 그것은 다른 일을 했다. 그것은 나의 라이브러리의 추가 의존 관계가 아니라 추가 의존 관계를 위해서였다.
    예를 들어, 현재 Djangoexample in the documentation가 있으므로 다음 명령을 실행하여 사용할 수 있습니다.
    poetry add Django -E argon2
    
    이것은 "Django 추가 설치"pyproject.toml를 의미합니다.이것은 "Django를 설치하고 poetry add ... -E ... 추가 항목에 설치하는 것"을 의미한다고 생각합니다.

    추가 항목 2개 문서 종속 항목


    구축 문서의 의존 항목은 argon2 폴더의 argon2 에서 지정되며, RTD는 이 의존 항목을 가져오도록 설정됩니다.나는 처음에 이 파일을 삭제할 수 없다고 생각했지만, 결과는 였다.
    감사it’s possible to make it work, 그중PEP 517, 당신은 시가가방에서 완성할 수 있습니다requirements.txt.19.0 이래로 pip에서 이런 상황이 발생했습니다. RTD에서 실행되는 pip는 이보다 업데이트됩니다.그러나 이 방법은 개발 의존항을 설치하지 않기 때문에 문서 의존항을 지정할 수 없습니다.그러나 docs/ 개의 추가 값을 지정하면 다음 작업을 수행할 수 있습니다.
    # pyproject.toml
    [tool.poetry.dependencies]
    ...
    myst-parser = {version = "^0.12", optional = true}
    sphinx = {version = "^3", optional = true}
    sphinx-autobuild = {version = "^2020.9.1", optional = true}
    sphinx-rtd-theme = {version = "^0.5", optional = true}
    
    [tool.poetry.extras]
    ...
    docs = [
        "myst-parser",
        "sphinx",
        "sphinx-autobuild",
        "sphinx-rtd-theme",
    ]
    
    # readthedocs.yml
    version: 2
    python:
      install:
        - method: pip
          path: .
          extra_requirements:
            - docs
    
    이렇게 하는 단점은 추가 비용이 당신의 패키지의 일부이기 때문에 이상적이지 않다는 것이다.

    시와 발표하다


    나는 최근에 발표한 자동화를 로 옮겼다. 이것은 나에게 매우 좋다. 만약 그것이 작용하지 않는다면 이것은 차단기가 될 것이다.이것들은 내가 필요로 하는 것이다.
  • 구성을 pip install . 에서 이동합니다.
  • 패키지 버전은 docspyproject.toml 에서 지정됩니다.
  • build 명령을 업데이트하여 setuptools 대신 Poetry를 사용합니다.
  • 다음은 pyproject.toml 의 PSR 구성입니다.
    [tool.semantic_release]
    version_variable = [
        "deezer/ __init__.py: __version__",
        "pyproject.toml:version"
    ]
    build_command = "pip install poetry && poetry build"
    
    나는 본래 더 많은 변화가 있을 것이라고 생각했지만, 이 모든 것은 상자를 열면 바로 쓸 수 있는 것이다.

    Python 의미 발표 Linting 및 코드 형식


    linting과 코드 포맷에 사용되는 모든 도구는 __init__.py 를 통해 설정되어 있으며, 이상적인 경우, pyproject.toml 로 교체하고 싶습니다.flake8 을 제외하고는 거의 모든 것이 실현될 수 있다.
    가능한 한 많은 내용을 setup.cfg 로 옮기고 flake8 config를 pyproject.toml 로 옮기기로 했습니다.
    이 모든 것이 있으면 pyproject.toml 및 모든 의존 항목의 pip 도구 파일을 삭제할 수 있습니다.

    미해결 문제 코드 덮어쓰기


    Pytest 유화 .flake8에 대해 처음에 주의를 기울이지 않았고 setup.cfg 아래에 배치했습니다. 이 부분은 실제로는 pyproject.toml일 것입니다.
    그 결과 내 설정이 무시되었습니다. 덮어쓰기를 사용하는 상황에서 테스트를 실행하지 않았습니다. 이것은 덮어쓰기 부분 [tool.pytest] 의 또 다른 오류를 없앴습니다. 그 중 원본은 하나의 그룹이어야 합니다.
    [tool.pytest.ini_options]
    addopts = "-v -Wdefault --cov=deezer"
    
    [tool.coverage.run]
    branch = true
    source = ["deezer"]
    
    이렇게pytest는 덮어쓰고 실행할 수 있지만, 어떤 이유로,codecov는 보고서를 정확하게 얻지 못했습니다.작업할 때 보통 [tool.pytest.ini_options] 파일을 찾게 되므로 CI 명령을 편집하여 tool.coverage.run 파일을 생성합니다.
    poetry run pytest --cov-report=xml
    
    이러한 변경을 통해 나는 최종적으로 코드 덮어쓰기 보고서를 복구했지만, 이것은 내가 원시 이전에서 놓친 것이다.시와 직접적인 관계는 없지만 흥미로운 것은 Pytest가 이 부분의 이름을 사용하기로 결정했다는 것이다.

    예상치 못한 구성 섹션 독물


    시와 Tox는 잘 어울린다. 나는 를 따랐다. 다음은 이러한 변화에 대한 개술이다.
    [tox]
    isolated_build = true
    envlist = py36,py37,py38,py39,pypy3,docs,lint,bandit
    
    [testenv]
    whitelist_externals = poetry
    commands =
        poetry install
        poetry run pytest
    ...
    
    실행할 명령 목록에서 각 xml--cov-report=xml 부분을 deps 로 바꾸고 testenv 을 격리 환경에서 실행할 모든 명령의 접두사로 사용합니다.

    FAQ의 섹션 Github 작업


    Poetry는 Github Actions에 설치되지 않으며 간단한 poetry install 절차를 통해 설치할 수도 있고 를 사용하여 설치할 수도 있습니다.나는 믿을 만한 약속이 나를 위해 최신을 유지할 수 있다고 생각하기 위해 집중적인 행동을 선택했다.
    나머지 변경은 간단합니다. poetry runrun 로 바꾸고 pip install 를 모든 명령의 접두사로 사용하는 것입니다.내 문서는 테스트를 거쳐 poetry install -E ... 디렉터리를 변경하고 있습니다. 이 기회를 빌려 Github 작업 단계의 poetry run 키를 사용했습니다.

    집중적 행동 판결


    시는 웅대한 구호를 전달했습니까?제 생각에는 그렇습니다. Poetry의 개발자 체험은 저에게 깊은 인상을 남겼습니다. Poetry의 CLI는 정말 좋습니다. 저는 길에서 작은 문제에 부딪혔습니다.전반적으로 마이그레이션이 어렵지 않으므로 Github에서 확인할 수 있습니다 .나는 내가 방금 표면(예를 들어 다중 환경)에 닿은 기능이 상당히 많다고 생각한다.
    나는 이것이 장기적으로 어떻게 작동하는지 좀 기다릴 것이다. 그러나 나는 곧 나의 다른 프로젝트를 이전할 것이라고 생각한다.

    좋은 웹페이지 즐겨찾기