Setup.py dosyasını kullanmadan kaynak dağıtımı nasıl yapılır?


10

Aşağıdaki paket yapısı ile

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

İçeriği setup.py

from setuptools import setup
setup()

İçeriği setup.cfg

[metadata]
name = my_package
version = 0.1

[options]
packages = find:

Ben tekerleği veya bir kaynak dağılımını inşa edebilirsiniz my_packagegibi bu

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

Ancak , kurulum araçlarının sürdürücüsüne göre , bildirici bir yapı yapılandırması idealdir ve zorunlu bir yapı kullanmak bir kod kokusu olacaktır. Biz değiştirmek Yani setup.pyile pyproject.toml:

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

İçeriği pyproject.toml

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

Ve yine de eskisi gibi bir tekerlek inşa edebilirsiniz, işe yarıyor. Ancak sdist çalışmıyor:

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

Peki setuptools kullanarak .tar.gz dosyasını nasıl oluşturmalısınız ? Sdist oluşturmak için kullanıcıya bakan araç nedir? Yapı arka ucunu değiştirmek istemiyorum. Diğer paketleme araçlarının hepsi kendi derleme giriş noktalarını yazıyor gibi görünüyor, ancak meta verilerdeki bir bildirici derleme sistemini tanımlamanın tümünün, derleme sistemi ile pratik olmanız gerekmediğini, farklı paketleme aracı çağrılmayı veya yorumlayıcıya girmeyi ve bir Python API'sını manuel olarak çağırmayı bekler. Ancak derleme sistemi gereksinimleri için PEP şimdi 2 yıldan daha eski. Burada bariz bir şey mi kaçırıyorum?

setup.pyDosya kullanmadan kaynak dağıtımı nasıl yapılır ?

Yanıtlar:


10

Bu biraz tartışmalı bir konudur ve şu anın cevabı, herkesin kabul ettiği tek bir aracın kaynak dağıtımları oluşturmanın "doğru yolu" olmaması ya da bu aracın ne olacağıdır. Python Ambalaj söyleminde bunun hakkında uzun bir konu görebilirsiniz .

Ben kumlar sürekli yön değiştirir çünkü dayanıklı formatlarda çok fazla ambalaj tavsiye vermek tereddüt, ancak Kasım 2019 itibariyle setup.py sdistedilir değil kaldırılan, ancak does PEP 517 ve PEP 518 düzeltme amaçladığını iddia tüm olumsuz yanları var - var yani o oluşturma ortamını kendiniz oluşturmak (ve tüm yapı bağımlılıklarını bilmek) ve yalnızca setuptools / distutils ve bunların eşdeğerleriyle çalışır.

Bu bir "resmi" öneri değil, şu anki en iyi yedek setup.py sdistve setup.py bdist_wheelkomut satırı sürümü çağırıyor pep517. Bunun yerine sdist:

python -m pep517.build --source .

Tekerleği ve kaynak dağıtımını aynı anda inşa edebilirsiniz:

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

PEP 517 uyumlu paketlerimi bu şekilde oluştururum.

Bu, projenizde a pyproject.tomlve pyproject.tomlolması build-system.requiresve build-system.build-backendanahtarlara sahip olmasını gerektirir , ancak PEP 517 uyumlu bir arka uca (dahil flit) sahip herhangi bir proje için çalışacaktır .

Diğer araçlar :

Neden kullanmayın flitveya poetryveya hatch? Bu araçların hepsi bunları kullanmak isteyenler için mevcuttur, ancak bu sorunun cevabı değildir . Bu soru, setuptoolsbildirim setup.cfgbiçimini kullanan projelerle ilgili sorular soruyor . Ne flitde ne de poetrygenel PEP 517 ön uçlar oluşturmazlar ve bu nedenle yalnızca ilgili arka uçlarını kullanan projeler için derleme komutları olarak çalışırlar.

Ben ile ilgili bilgi sahibi yeterince değilim hatcho arkauçlu projeleri yönetmek olup olmadığını söylemek için diğer (2019 Kasım ayı itibarıyla tekrar) setuptools daha ama, öyle değil bir PEP 517 önyüzü ve iş sizde olmayan etmezse a setup.py("setup.py dosyası açılamıyor" hatasını yükseltir ve dosyanızı yoksayar pyproject.toml).


Neden pep517.buildsadece bir deney, geçici bir koltuk değneği anlamına gelen odaklanma , şiir, kapak ve muhtemelen daha fazlası gibi üretken araçlar olduğunda odaklanın ?
sinoroc

1
Çünkü bu benim tahminimde başarılı bir deneydi (ben ve diğer pek çok PyPA çalışanı), iş için doğru anlambilimine sahip olduğu ve bildiğim tek genel amaçlı PEP 517 yapı ön uç olduğu için. flit ve şiir, arka uçlarını kullanmanızı bekledikleri için dikey olarak entegredir. hatch başka şeyler yapıyor gibi görünüyor. pep517.buildtam olarak bu amaçla yapılmış basit bir araçtır.
Paul

Ah doğru, iyi bir nokta. Yapı arka uçlarına odaklanıyordum. Aslında pep517.buildbunlardan biri olduğunu düşündüm . Ama hiç de değil, aslında bir yapı ön uç. Ayrıca kapak şimdi gördüğüm gibi PEP517 hazır değil.
sinoroc

1
Sorunuzu yanıtlamak için cevabımı güncelledim.
Paul

Evet mükemmel. Cevabımı siliyorum.
sinoroc

-1

Python paketleme söz konusu olduğunda "açık" hiçbir şey yoktur. Gerçekten de, şimdilik, en azından distutils / setuptools kullanıyorsanız, tamamen bildirici kullanıyor olsanız setup.pybile (neredeyse) boş bir dosya oluşturmanız gerekir setup.cfg:

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

Ben de tavsiye ederim chmod +x setup.py.

Bu durumda, sadece "giriş noktası" nı derleme sistemine kendiniz yazıyorsunuz ve setup()sadece bunun main()işlevidir - ancak artık geleneksel olarak aktarılan tüm argümanlar bunun yerine setup()okunabilir setup.cfg.

Artık setup.py sdistbir kaynak tarball yapmak istiyorsanız yine de kullanabilirsiniz :

./setup.py sdist

Ayrıca pyproject.toml, Flit gibi etkinleştirilen alternatif derleme sistemlerinden birini de deneyebilirsiniz .


Bunun neden reddedildiğinden emin değilim; başka çözümler olsa bile temelde doğrudur.
Iguananaut

2
Soru başlığı "Nasıl bir kaynak dağılımını oluşturmaktır olmadan setup.py dosyasını kullanarak?" Bu yanıt, yalnızca "sildiğiniz aynı setup.py dosyasını nasıl yeniden oluşturacağınızı" gösteriyor.
platypus

Evet, ancak bu, bildirici yazmanın, kurulum setup.cfgaraçlarını setup.pykullanmak için artık gerekli olmadığı anlamına gelen bir yanlış anlaşılmaya dayanıyordu , bu doğru değil. Sorunun başlığı yanıltıcı olması, cevabın olduğu anlamına gelmez. "Peki .tar.gz dosyasını setuptools kullanarak nasıl oluşturmalısınız ?" ki bu doğru cevap verir.
Iguananaut

1
Aslında doğrudur. PEP 517 kullanıyorsanız setuptools bir setup.py dosyası gerektirmez.
Paul

"PEP 517 kullanıyorsanız" hariç çoğu insan değildir. Hala geçici olduğunu ve zorlukla bile belirtilen packaging.python.org . Aramaya gitmeyi bilmedikçe sahip olacağın bir şey değil. Sadece kurulum araçlarının her zaman eskisi gibi çalışmasını istiyorsanız doğrudur.
Iguananaut
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.