2017-10-23 22 views
0

내 패키지의 버전 번호가 필요로하는 모든 것을 참조 할 수있는 단일 장소에 있어야합니다.`src /`디렉토리의 python 패키지에서 프로젝트 루트의 텍스트 파일에 액세스하는 방법

Single Sourcing the Package Version에 대한이 파이썬 가이드에서 몇 가지 제안 사항을 발견했으며 # 4를 시도하여 내 프로젝트 루트에 VERSION이라는 간단한 텍스트 파일로 저장하기로 결정했습니다. 여기

내 프로젝트의 디렉토리 트리의 단축 버전입니다 (당신이 볼 수있는 the full project on GitHub) : 형제는, 그것은 설치 스크립트 내부 버전의 파일을 읽고 수행하는 것은 매우 간단

. 
├── MANIFEST.in 
├── README.md 
├── setup.py 
├── VERSION 
├── src/ 
│   └── fluidspaces/ 
│    ├── __init__.py 
│    ├── __main__.py 
│    ├── i3_commands.py 
│    ├── rofi_commands.py 
│    ├── workspace.py 
│    └── workspaces.py 
└── tests/ 
   ├── test_workspace.py 
   └── test_workspaces.py 

VERSION 이후 및 setup.py 어떤 나는 그걸로 원해.

그러나 VERSIONsrc/fluidspaces/__main__.py은 형제가 아니며 기본 모듈은 프로젝트 루트의 경로를 알지 못하므로이 방법을 사용할 수 없습니다.

가이드

이 알림을했다 :

경고 :이 방법을 사용하면 VERSION 파일 (예를 들어 추가하여 MANIFEST.in에 버전을 포함) 모든 소스 및 바이너리 배포판에 포함되어 있는지 확인해야합니다. 대신 프로젝트 루트 경로를 필요로하는 패키지 모듈의 버전 파일을 쉽게 액세스 할 수 있도록 빌드시에 패키지로 복사 할 수 - -하지만 난 매니페스트 및 버전 파일 라인은 여전히 ​​아무튼 덧붙였다 합리적인 듯

어디서나 빌드에 나타납니다.

빌드하려면 프로젝트 루트와 virtualenv 내부에서 pip install -U .을 실행하고 있습니다. 다음은 결과로 <virtualenv>/lib/python3.6/site-packages에서 만든받을 폴더는 다음과 같습니다

내 구성 파일의
fluidspaces/ 
├── i3_commands.py 
├── __init__.py 
├── __main__.py 
├── __pycache__/ # contents snipped 
├── rofi_commands.py 
├── workspace.py 
└── workspaces.py 
fluidspaces-0.1.0-py3.6.egg-info/ 
├── dependency_links.txt 
├── entry_points.txt 
├── installed-files.txt 
├── PKG-INFO 
├── SOURCES.txt 
└── top_level.txt 

더 :

MANIFEST.in :

include README.md 
include VERSION 
graft src 
prune tests 

setup.py :

#!/usr/bin/env python3 

from setuptools import setup, find_packages 


def readme(): 
    '''Get long description from readme file''' 
    with open('README.md') as f: 
     return f.read() 


def version(): 
    '''Get version from version file''' 
    with open('VERSION') as f: 
     return f.read().strip() 


setup(
    name='fluidspaces', 
    version=version(), 
    description='Navigate i3wm named containers', 
    long_description=readme(), 
    author='Peter Henry', 
    author_email='[email protected]', 
    url='https://github.com/mosbasik/fluidspaces', 
    license='MIT', 
    classifiers=[ 
     'Development Status :: 3 - Alpha', 
     'Programming Language :: Python :: 3.6', 
    ], 
    packages=find_packages('src'), 
    include_package_data=True, 
    package_dir={'': 'src'}, 
    package_data={'': ['VERSION']}, 
    setup_requires=[ 
     'pytest-runner', 
    ], 
    tests_require=[ 
     'pytest', 
    ], 
    entry_points={ 
     'console_scripts': [ 
      'fluidspaces = fluidspaces.__main__:main', 
     ], 
    }, 
    python_requires='~=3.6', 
) 

이 질문은입니다. 그 때문에 pkg_resources 라이브러리가 제 문제에 대한 해답이 될 수 있다고 생각하지만, 제 상황에서는 그것을 사용하는 방법을 알 수 없었습니다.

내가 발견 한 대부분의 예제는 src/ 디렉토리가 아닌 프로젝트 루트에 직접 파이썬 패키지가 있기 때문에 문제가 발생했습니다.나는 때문에이 같은 권고 src/ 디렉토리를 사용하고 있습니다 : 내가 찾은

다른 손잡이를 약간 비틀 시도하면 package_data, include_package_data 있습니다 , setup()에 대해서는 data_files kwargs입니다. 그들이 얼마나 관련이 있는지 모릅니다. 매니 페스트에서 선언 한 것과 이것들로 선언 된 것 사이에는 약간의 상호 작용이있는 것처럼 보입니다.하지만 자세한 것은 확실하지 않습니다.

답변

0

이 문제에 관해 Freenode의 #python IRC 채널에있는 사람들과 채팅했습니다.

  • pkg_resources 내가해야 내가 요구 한 것을 수행하는 방법 아마 이었지만, 패키지 디렉토리 대신 프로젝트 루트의 버전 파일을 넣어 필요 : 나는 배웠다.
  • setup.py에서 나는 패키지 디렉토리에서 패키지 파일을 가져 오지 않고 (몇 가지 이유로 no-no로) 그런 버전 파일을 읽을 수 있지만 루트에서 패키지로의 경로를 하드 코딩해야합니다. 피하고 싶었다.

은 결국 나는 (다른 사람이 자신의 패키지와 해당 인수와 설득력 있다고하고 있었다) 내 자식 태그에서 대신 내의 repo에서 파일 버전 정보를 얻을 수있는 setuptools_scm 패키지를 사용하기로 결정했다.

setup.py : 결과

, 나는 아주 쉽게 setup.py 내 버전 번호를 가지고

from setuptools import setup, find_packages 

def readme(): 
    '''Get long description from readme file''' 
    with open('README.md') as f: 
     return f.read() 

setup(
    name='fluidspaces', 
    use_scm_version=True, # use this instead of version 
    description='Navigate i3wm named containers', 
    long_description=readme(), 
    author='Peter Henry', 
    author_email='[email protected]', 
    url='https://github.com/mosbasik/fluidspaces', 
    license='MIT', 
    classifiers=[ 
     'Development Status :: 3 - Alpha', 
     'Programming Language :: Python :: 3.6', 
    ], 
    packages=find_packages('src'), 
    package_dir={'': 'src'}, 
    setup_requires=[ 
     'pytest-runner', 
     'setuptools_scm', # require package for setup 
    ], 
    tests_require=[ 
     'pytest', 
    ], 
    entry_points={ 
     'console_scripts': [ 
      'fluidspaces = fluidspaces.__main__:main', 
     ], 
    }, 
    python_requires='~=3.6', 
) 

을하지만 난 나타내는 하드 코딩 된 경로가 필요 결국 무엇을 프로젝트 루트는 패키지 코드와 관련이 있어야합니다. 이는 이전에 피하고 있던 일종의 코드입니다. 내 생각에 이것은 this issue on the setuptools_scm GitHub repo이 필요한 이유 일 수 있습니다.

SRC/fluidspaces/__ main__.py :

import argparse 
from setuptools_scm import get_version # import this function 

def main(args=None): 
    # set up command line argument parsing 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-V', '--version', 
         action='version', 
         version=get_version(root='../..', relative_to=__file__)) # and call it here