setup.pyファイルを使用せずにソースディストリビューションをビルドする方法は?


10

以下のパッケージ構造で

.
├── my_package
   └── __init__.py
├── setup.cfg
└── setup.py

の内容 setup.py

from setuptools import setup
setup()

の内容 setup.cfg

[metadata]
name = my_package
version = 0.1

[options]
packages = find:

my_packageこのようにホイールまたはソース配布を構築できます

pip wheel --no-deps -w dist .
# generates file ./dist/my_package-0.1-py3-none-any.whl
python setup.py sdist
# generates file ./dist/my_package-0.1.tar.gz

しかし、setuptoolsのメンテナーによると、宣言型ビルド構成が理想的であり、命令型ビルドを使用することはコードの匂いになるでしょう。交換してください、私たちはそうsetup.pypyproject.toml

.
├── my_package
   └── __init__.py
├── setup.cfg
└── pyproject.toml

の内容 pyproject.toml

[build-system]
build-backend = "setuptools.build_meta"
requires = ["setuptools", "wheel"]

また、以前と同じ方法でホイールを構築できますが、機能します。しかし、sdistは機能しません。

python: can't open file 'setup.py': [Errno 2] No such file or directory

では、実際にsetuptoolsを使用して.tar.gzファイルどのように構築する必要がありますか?sdistを作成するためのユーザー向けツールは何ですか?ビルドバックエンドを変更したくありません。他のパッケージツールはすべて独自のビルドエントリポイントを記述しているように見えますが、メタデータで宣言型ビルドシステムを定義することの要点は、ビルドシステムを実際に使用する必要がなく、それぞれについて学習することであると思いました別のパッケージツールが呼び出されるか、インタプリタに移動してPython APIを手動で呼び出す必要があることを想定しています。しかし、ビルドシステム要件のPEPは2年以上前のものです。ここに明らかなものがないのですか?

setup.pyファイルを使用せずにソース配布を構築するにはどうすればよいですか?

回答:


10

これはやや物議を醸すトピックであり、現時点での答えは、誰もがソース配布を構築するための「正しい方法」であると同意する単一のツールはなく、そのツールは何であろうということです。あなたはそれについての長いスレッドをPythonパッケージング談話で見ることができます。

私は砂が常にシフトしているので、耐久性のあるフォーマットにあまりにも多くの包装の助言を与えることを躊躇したが、2019年11月の時点で、setup.py sdistされていない非推奨、それはありません PEP 517とPEP 518を修正することを意図していたことを、すべての欠点を持っている-あなたが持っている、すなわちことビルド環境を自分で作成し(ビルドのすべての依存関係を知って)、setuptools / distutilsと同等のものでのみ機能します。

これは「公式」の推奨事項ではありませんが、のコマンドラインバージョンの現在の最適な代替でsetup.py sdistあり、setup.py bdist_wheel呼び出していpep517ます。の代わりsdistは:

python -m pep517.build --source .

次のようにして、wheelとソース配布を同時にビルドできます。

python -m pep517.build --source --binary .

これは、PEP 517互換パッケージをビルドする方法です。

これには、プロジェクトpyproject.tomlにとがpyproject.toml必要でありbuild-system.requiresbuild-system.build-backendキーが必要ですが、PEP 517互換のバックエンド(flit)。

その他のツール

flitorまたはpoetryorを使用しないのはなぜhatchですか?これらのツールはすべて、使用したい人が利用できますが、この質問に対する回答ではありません。この質問はsetuptools、宣言setup.cfg形式を使用してビルドされたプロジェクトについて尋ねています。どちらflitpoetry一般的なPEP 517ビルドフロントエンドとして機能しないため、それぞれのバックエンドを使用するプロジェクトのビルドコマンドとしてのみ機能します。

私は精通十分ではありませんよhatch、それはバックエンドでのプロジェクトを管理できるかどうかを言って、他の setuptoolsのよりますが、(再び、2019年11月のように)、それはありません PEP 517のフロントエンド、そしてあなたが持っていない場合、それは動作しません。 a setup.py(「ファイルsetup.pyを開けません」というエラーが発生し、pyproject.tomlファイルは無視されます)。


pep517.buildフリット、詩、ハッチなどの生産性の高いツールがある場合に、一時的な松葉杖だけを実験として使用することに焦点を当てるのはなぜですか?
sinoroc

1
それは私の見積もりにおいて成功した実験でした(私と他の多くのPyPAの人々がそれを使用しています)、それは仕事に適切なセマンティクスを持っているため、そしてそれが私が知っている唯一の汎用PEP 517ビルドフロントエンドだからです。フリットと詩は垂直に統合されており、バックエンドの使用を期待しています。ハッチは他の多くのことをするように見えます。pep517.buildまさにこの目的のために構築されたシンプルなツールです。
ポール・

ああ、いい点。私はビルドのバックエンドに焦点を合わせていました。そして、私は実際pep517.buildにそれらの1つだと思いました。しかし、まったくそうではありません。それは実際にはビルドのフロントエンドです。また、ハッチは今見ているようにPEP517の準備ができていません。
sinoroc

1
私はあなたの質問に対処するために私の答えを更新しました。
ポール

はい、完璧です。回答を削除します。
sinoroc

-1

Pythonパッケージに関しては、「明白」なものは何もありません。実際、当分の間、少なくともdistutils / setuptoolsを使用しsetup.pyている場合は、完全に宣言型を使用している場合でも、(ほぼ)空のファイルを作成する必要がありますsetup.cfg

#!/usr/bin/env python
from setuptools import setup
setup()

私もお勧めしchmod +x setup.pyます。

この場合、ビルドシステムへの「エントリポイント」を自分で書き込んでいるsetup()だけで、そのmain()ための関数にすぎません。ただし、従来は渡されていたすべての引数を代わりsetup()に読み取ることができますsetup.cfg

これでsetup.py sdist、ソースtarballを作成する場合に引き続き使用できます。

./setup.py sdist

Flitpyproject.tomlなど、を介して有効になる代替ビルドシステムの1つを試すこともできます。


なぜこれが反対投票されているのかわからない。他の解決策があったとしても、それは基本的に正しいです。
イグアナナウ

2
質問のタイトルは、「setup.pyファイル使用せずにソースディストリビューションを構築する方法」です。この回答は、「ここで、削除したばかりの同じsetup.pyファイルを再作成する方法」を示しているように見えるだけで、役に立たないようです。
カモノハシ

はい、しかしそれは、宣言型の記述はsetup.cfga setup.pyがsetuptoolsを使用する必要がなくなったことを意味するという誤解に基づいていましたが、これは正しくありません。質問のタイトルが誤解を招くからといって、答えが正しいとは限りません。彼らは質問の本文に「setuptoolsを使用して実際に.tar.gzファイルどのように構築すべきですか?」と書いています。これは正しく答えます。
イグアナナウ

1
それは本当です。あなたはPEP 517を使用している場合はsetuptoolsのは、setup.pyファイルを必要としない
ポール・

「PEP 517を使用している場合」ほとんどの人は使用していません。それはまだ暫定的だ、とかろうじてさえに記載されているpackaging.python.org。あなたがそれを探しに行くことを知らない限り、それはあなたが持っているものではありません。いつも慣れている通りにsetuptoolsを機能させたい場合はこれで問題ありません。
イグアナナウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.