Z następującą strukturą pakietu
.
├── my_package
│ └── __init__.py
├── setup.cfg
└── setup.py
Zawartość setup.py
from setuptools import setup
setup()
Zawartość setup.cfg
[metadata]
name = my_package
version = 0.1
[options]
packages = find:
Mogę zbudować koło lub dystrybucję źródła dla my_package
tego typu
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
Jednak według opiekuna setuptools konfiguracja kompilacji deklaratywnej jest idealna, a użycie kompilacji rozkazowej będzie zapachem kodu. Więc zastąpić setup.py
z pyproject.toml
:
.
├── my_package
│ └── __init__.py
├── setup.cfg
└── pyproject.toml
Zawartość pyproject.toml
[build-system]
build-backend = "setuptools.build_meta"
requires = ["setuptools", "wheel"]
I nadal możesz zbudować koło w taki sam sposób, jak wcześniej, działa. Ale sdist nie działa:
python: can't open file 'setup.py': [Errno 2] No such file or directory
Jak więc właściwie zbudować plik .tar.gz za pomocą setuptools ? Jakie narzędzie do tworzenia sdist jest przeznaczone dla użytkownika? Nie chcę zmieniać backendu kompilacji. Wygląda na to, że wszystkie inne narzędzia do pakowania zapisują własne punkty wejścia kompilacji, ale pomyślałem, że cały sens definiowania deklaratywnego systemu kompilacji w metadanych polegał na tym, że nie trzeba było wchodzić w interakcję z systemem budowania, ucząc się, jak każdy inne narzędzie do pakowania oczekuje na wywołanie lub konieczność wejścia do interpretera i ręcznego wywołania API Pythona. Ale PEP dla wymagań systemowych kompilacji ma już ponad 2 lata. Czy brakuje mi czegoś oczywistego?
Jak zbudować dystrybucję źródłową bez użycia setup.py
pliku?
pep517.build
czymś, co ma być tylko eksperymentem, chwilową kulą, gdy istnieją produktywne narzędzia, takie jak flit, poezja, kreskowanie i prawdopodobnie jeszcze więcej?pep517.build
jest prostym narzędziem zbudowanym właśnie do tego celu.pep517.build
to jeden z nich. Ale wcale nie jest to front-end kompilacji. Również klapa nie jest PEP517 gotowy jak widzę teraz.Nie ma nic „oczywistego”, jeśli chodzi o opakowanie Pythona. Rzeczywiście, na razie, przynajmniej jeśli używasz distutils / setuptools, konieczne jest utworzenie (prawie) pustego
setup.py
pliku, nawet jeśli używasz w pełni deklaratywnegosetup.cfg
:Polecam również
chmod +x setup.py
.W tym przypadku sam piszesz „punkt wejścia” do systemu kompilacji i
setup()
jest on po prostu jegomain()
funkcją - ale teraz zamiast tegosetup()
można odczytać wszystkie argumenty, które zostały tradycyjnie przekazanesetup.cfg
.Teraz możesz nadal używać,
setup.py sdist
jeśli chcesz zrobić archiwum źródłowe:./setup.py sdist
Możesz także wypróbować jeden z alternatywnych systemów kompilacji, które są włączane przez
pyproject.toml
, na przykład Flit .źródło
setup.cfg
oznacza, żesetup.py
korzystanie z setuptools nie jest już konieczne, co nie jest prawdą. To, że tytuł pytania wprowadza w błąd, nie oznacza, że odpowiedź brzmi. Napisali w treści pytania „Więc jak właściwie zbudować plik .tar.gz za pomocą setuptools ?” na co odpowiada to poprawnie.