Làm cách nào để xây dựng phân phối nguồn mà không sử dụng tệp setup.py?


10

Với cấu trúc gói sau

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

Nội dung của setup.py

from setuptools import setup
setup()

Nội dung của setup.cfg

[metadata]
name = my_package
version = 0.1

[options]
packages = find:

Tôi có thể xây dựng bánh xe hoặc phân phối nguồn cho my_packagenhư thế này

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

Nhưng theo người duy trì setuptools , một cấu hình xây dựng khai báo là lý tưởng và sử dụng một bản dựng bắt buộc sẽ là một mùi mã. Vì vậy, chúng tôi thay thế setup.pybằng pyproject.toml:

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

Nội dung của pyproject.toml

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

Và bạn vẫn có thể xây dựng một bánh xe giống như trước đây, nó hoạt động. Nhưng sdist không hoạt động:

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

Vì vậy, làm thế nào bạn thực sự nên xây dựng tệp .tar.gz bằng setuptools ? Công cụ hướng tới người dùng để tạo sdist là gì? Tôi không muốn thay đổi phụ trợ xây dựng. Có vẻ như tất cả các công cụ đóng gói khác đều viết các điểm vào bản dựng riêng của chúng, nhưng tôi nghĩ rằng toàn bộ điểm xác định hệ thống xây dựng khai báo trong siêu dữ liệu là để bạn không phải thực hiện với hệ thống xây dựng, tìm hiểu từng cách công cụ đóng gói khác nhau dự kiến ​​sẽ được gọi hoặc phải vào trình thông dịch và gọi API Python bằng tay. Nhưng PEP cho các yêu cầu hệ thống xây dựng đã hơn 2 năm tuổi. Tôi có thiếu một cái gì đó rõ ràng ở đây?

Làm thế nào để xây dựng một phân phối nguồn mà không sử dụng setup.pytập tin?

Câu trả lời:


10

Đây là một chủ đề gây tranh cãi và câu trả lời hiện tại là không có một công cụ duy nhất nào mà mọi người đồng ý là "cách đúng đắn" để xây dựng các bản phân phối nguồn, cũng như công cụ đó sẽ là gì. Bạn có thể thấy một chủ đề dài về nó trên diễn ngôn Bao bì Python .

Tôi ngần ngại đưa ra lời khuyên đóng gói quá nhiều trong các định dạng bền vì cát luôn thay đổi, nhưng tính đến tháng 11 năm 2019, setup.py sdistkhông phản đối, nhưng nó không có tất cả các nhược điểm mà PEP 517 và PEP 518 được dự định để sửa chữa - cụ thể mà bạn có để tự tạo môi trường xây dựng (và biết về tất cả các phụ thuộc của bản dựng) và nó chỉ hoạt động với setuptools / distutils và tương đương của chúng.

Đây không phải là khuyến nghị "chính thức", nhưng là sự thay thế tốt nhất hiện tại setup.py sdistsetup.py bdist_wheelđang gọi phiên bản dòng lệnh của pep517. Thay thế cho sdistlà:

python -m pep517.build --source .

Bạn có thể xây dựng bánh xe và phân phối nguồn cùng một lúc như vậy:

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

Đây là cách tôi xây dựng các gói tương thích PEP 517.

Điều này đòi hỏi dự án của bạn phải có pyproject.toml, và pyproject.tomlphải có build-system.requiresbuild-system.build-backendcác khóa, nhưng nó sẽ hoạt động cho bất kỳ dự án nào có phụ trợ tương thích PEP 517 (bao gồm flit).

Các công cụ khác :

Tại sao không sử dụng flithay poetryhay hatch? Những công cụ này đều có sẵn cho những người muốn sử dụng chúng, nhưng chúng không phải là câu trả lời cho câu hỏi này . Câu hỏi này là hỏi về các dự án được xây dựng với setuptoolsviệc sử dụng setup.cfgđịnh dạng khai báo . Không flitphải cũng poetryđóng vai trò là PEP 517 chung xây dựng giao diện người dùng và vì vậy chúng chỉ hoạt động như các lệnh xây dựng cho các dự án sử dụng các phụ trợ tương ứng.

Tôi không đủ quen thuộc hatchđể nói liệu nó có thể quản lý các dự án với các phụ trợ không phải là setuptools hay không, nhưng (một lần nữa, vào tháng 11 năm 2019), nó không phải là một giao diện PEP 517 và nó sẽ không hoạt động nếu bạn không có a setup.py(nó sẽ phát sinh lỗi "không thể mở tệp setup.py" và nó sẽ bỏ qua pyproject.tomltệp của bạn ).


Tại sao tập trung vào pep517.buildđó chỉ có ý nghĩa như một thử nghiệm, một cái nạng tạm thời khi có các công cụ sản xuất như flit, thơ, nở, và có lẽ nhiều hơn nữa?
sinoroc

1
Bởi vì đó là một thử nghiệm thành công trong ước tính của tôi (tôi và nhiều người PyPA khác sử dụng nó), vì nó có ngữ nghĩa phù hợp cho công việc, và vì đó là mặt trước duy nhất của PEP 517 xây dựng mục đích chung mà tôi biết. flit và thơ được tích hợp theo chiều dọc ở chỗ họ mong đợi bạn sử dụng phụ trợ của họ. nở dường như để làm nhiều thứ khác. pep517.buildlà một công cụ đơn giản được xây dựng cho chính xác mục đích này.
Paul

Ah đúng, điểm tốt. Tôi đã tập trung vào việc xây dựng back-end. Và tôi thực sự nghĩ pep517.buildlà một trong số họ. Nhưng hoàn toàn không phải, nó thực sự là một bản dựng. Ngoài ra hatch không sẵn sàng PEP517 như tôi thấy bây giờ.
sinoroc

1
Tôi đã cập nhật câu trả lời của tôi để giải quyết câu hỏi của bạn.
Paul

Vâng, hoàn hảo. Tôi xóa câu trả lời của tôi.
sinoroc

-1

Không có gì "rõ ràng" khi nói đến bao bì Python. Thật vậy, hiện tại, ít nhất nếu bạn đang sử dụng distutils / setuptools, cần phải tạo một setup.pytệp trống (gần) , ngay cả khi bạn đang sử dụng một khai báo đầy đủ setup.cfg:

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

Tôi cũng đề nghị chmod +x setup.py.

Trong trường hợp này, bạn chỉ đang tự viết "điểm vào" cho hệ thống xây dựng và setup()chỉ là main()chức năng cho nó - nhưng bây giờ tất cả các đối số được truyền theo truyền thống setup()có thể được đọc từ setup.cfgthay thế.

Bây giờ bạn vẫn có thể sử dụng setup.py sdistnếu bạn muốn tạo tarball nguồn:

./setup.py sdist

Bạn cũng có thể thử một trong những hệ thống xây dựng thay thế được kích hoạt thông qua pyproject.toml, chẳng hạn như Flit .


Không chắc chắn tại sao điều này đang bị hạ cấp; về cơ bản là chính xác ngay cả khi có các giải pháp khác.
Iguananaut

2
Tiêu đề câu hỏi là "Làm cách nào để xây dựng phân phối nguồn mà không cần sử dụng tệp setup.py?" Câu trả lời này dường như chỉ thể hiện "đây là cách tạo lại cùng một tệp setup.py mà bạn vừa xóa", không hữu ích.
thú mỏ vịt

Đúng, nhưng điều đó dựa trên sự hiểu lầm rằng viết một khai báo setup.cfgcó nghĩa setup.pylà không còn cần thiết nữa để sử dụng setuptools, điều đó không đúng. Chỉ vì tiêu đề của câu hỏi sai lệch không có nghĩa là câu trả lời. Họ đã viết trong phần thân của câu hỏi "Vậy bạn thực sự nên xây dựng tệp .tar.gz bằng cách sử dụng setuptools như thế nào?" mà điều này trả lời đúng.
Iguananaut

1
Nó thực sự là sự thật. setuptools không yêu cầu tệp setup.py nếu bạn đang sử dụng PEP 517.
Paul

"Nếu bạn đang sử dụng PEP 517" Ngoại trừ hầu hết mọi người không. Nó vẫn chỉ là tạm thời, và hầu như không được đề cập đến trong bao bì . Đó không phải là thứ bạn sẽ có trừ khi bạn biết đi tìm nó. Nếu bạn chỉ muốn setuptools hoạt động như nó luôn được sử dụng thì điều này là chính xác.
Iguananaut
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.