パッケージのバージョン番号を、必要なものすべてが参照できる単一の場所に配置したいと考えています。
この Python ガイドでパッケージ バージョンのシングル ソーシングに関するいくつかの提案を見つけたので、#4 を試して、プロジェクト ルートの という名前の単純なテキスト ファイルに保存することにしましたVERSION
。
これは、私のプロジェクトのディレクトリ ツリーの短縮版です (完全なプロジェクトは 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
、セットアップ スクリプト内のバージョン ファイルを読み取るのは非常に簡単です。
しかしVERSION
、src/fluidspaces/__main__.py
兄弟ではなく、メイン モジュールはプロジェクト ルートのパスを認識していないため、このアプローチは使用できません。
ガイドには次のリマインダーがありました。
警告: このアプローチでは、VERSION ファイルがすべてのソースおよびバイナリ ディストリビューションに含まれていることを確認する必要があります (たとえば、MANIFEST.in に include VERSION を追加します)。
それは合理的だと思われました-プロジェクトのルートパスを必要とするパッケージモジュールの代わりに、ビルド時にバージョンファイルをパッケージにコピーして簡単にアクセスできます-しかし、その行をマニフェストに追加しましたが、バージョンファイルはまだ表示されていないようですどこでもビルドできます。
ビルドするにはpip install -U .
、プロジェクト ルートから、virtualenv 内で実行しています。<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='me@peterhenry.net',
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',
)
私はこのSOの質問を見つけました「data_files」ルートディレクトリを取得するためのPython関数はありますか? ライブラリが私の問題に対する答えだと思いますpkg_resources
が、自分の状況でそれを使用する方法を理解できませんでした。
私が見つけたほとんどの例では、src/
ディレクトリに分離されているのではなく、プロジェクトのルートに直接 python パッケージがあるため、問題が発生しています。src/
次のような推奨事項があるため、ディレクトリを使用しています。
- PyTest: グッド プラクティス: アプリケーション コード外でのテスト
- Ionel Cristian Mărieş - Python ライブラリのパッケージ化
- Hynek Schlawack - テストとパッケージング
私が見つけて少しひねってみた他のノブは、package_data
、include_package_data
、およびdata_files
kwargs ですsetup()
。それらがどれほど関連性があるかわかりません。これらで宣言されたものとマニフェストで宣言されたものとの間に相互作用があるようですが、詳細についてはわかりません。