2011-11-09 31 views
12

Do sau (trình diễn) bố trí dự án:Tạo kiểu phân phối khác nhau với setup.py

MyProject/ 
    README 
    LICENSE 
    setup.py 
    myproject/ 
     ... # packages 
    extrastuff/ 
     ... # some extra data 

thế nào (và ở đâu) để tôi khai báo các loại phân phối khác nhau? Đặc biệt tôi cần hai tùy chọn sau đây:

  1. Một phân phối chỉ chứa nguồn

  2. Một phân phối có chứa nguồn và tất cả các file dữ liệu dưới (extrastuff)

Lý tưởng nhất, làm thế nào tôi khai báo hai cấu hình trên trong khi cấu hình thứ hai phụ thuộc vào cấu hình đầu tiên?

+1

Tại sao không tạo các tệp 'setup.py' khác? Phân phối nguồn có sẵn dưới dạng 'sdist'. –

+0

@Brian: Tôi biết về 'sdist', cảm ơn. Tôi là người duy trì dự án nguồn mở ở quy mô trung bình và tôi muốn tuân thủ các quy ước chung (như có một 'setup.py' quản lý việc đóng gói/cài đặt). Tôi thực sự muốn xem giải pháp chỉ sử dụng một tập lệnh thiết lập. – Constantinius

+0

Tôi không thể cung cấp chi tiết vì trước đây tôi chưa từng có vấn đề như vậy. Một cách tiếp cận có thể cung cấp lệnh 'sdist' của riêng bạn mà chỉ cần gọi' sdist' cũ với siêu dữ liệu khác nhau phụ thuộc vào phân phối đích. Bản phân phối có thể được cung cấp như một tùy chọn từ dòng lệnh hoặc sử dụng 'platform.linux_distribution' để có được cùng một phân phối mục tiêu như phân phối trong máy gọi là 'setup.py' theo mặc định. – jcollado

Trả lời

11

Tôi đã thực hiện một cái gì đó như thế này trước đây ... lệnh sdist có thể được mở rộng để xử lý các đối số dòng lệnh bổ sung và để thao tác các tệp dữ liệu dựa trên các đối số này. Nếu bạn chạy python setup.py sdist --help, nó sẽ bao gồm các đối số dòng lệnh tùy chỉnh của bạn trong trợ giúp, điều này rất hay. Sử dụng công thức sau:

from distutils import log 
from distutils.core import setup 
from distutils.command.sdist import sdist 

class CustomSdist(sdist): 

    user_options = [ 
     ('packaging=', None, "Some option to indicate what should be packaged") 
    ] + sdist.user_options 

    def __init__(self, *args, **kwargs): 
     sdist.__init__(self, *args, **kwargs) 

     self.packaging = "default value for this option" 

    def get_file_list(self): 

     log.info("Chosen packaging option: {self.packaging}".format(self=self)) 

     # Change the data_files list here based on the packaging option 
     self.distribution.data_files = list(
      ('folder', ['file1', 'file2']) 
     ) 
     sdist.get_file_list(self) 

if __name__ == "__main__": 

    setup(
     name = "name", 
     version = "version", 
     author = "author", 
     author_email = "author_email", 
     url = "url", 
     py_modules = [ 
      # ... 
     ], 
     packages = [ 
      # ... 
     ], 
#  data_files = default data files for commands other than sdist if you wish 
     cmdclass={ 
      'sdist': CustomSdist 
     } 
    ) 
+0

Cảm ơn rất nhiều vì giải pháp đó, tôi nghĩ tôi sẽ đi cho giải pháp đó. – Constantinius

3

Bạn có thể mở rộng setup.py để bổ sung thêm một số phân tích cú pháp dòng lệnh tùy chỉnh. Sau đó, bạn có thể bắt được đối số tùy chỉnh và loại bỏ đối số đó để nó không ảnh hưởng đến setuptools.

Bạn có thể truy cập đối số dòng lệnh trong sys.argv. Đối với thay đổi cuộc gọi đến setuptools.setup(), tôi khuyên bạn nên tạo một từ điển của các đối số để vượt qua, sửa đổi điển dựa trên các đối số dòng lệnh, và sau đó gọi setup() sử dụng **dict ký hiệu, như vậy:

from setuptools import setup 
import sys 

basic = {'name': 'my program'} 
extra = {'bonus': 'content'} 

if '--extras' in sys.argv: 
    basic.update(extra) 
    sys.argv.remove('--extras') 

setup(**basic) 

Đối với kỹ hơn phân tích cú pháp dòng lệnh, bạn cũng có thể sử dụng getopt module hoặc argparse module mới hơn nếu bạn chỉ nhắm mục tiêu Python 2.7 trở lên.

CHỈNH SỬA: Tôi cũng tìm thấy một phần trong tài liệu có tên là Creating a new Distutils command. Đó cũng có thể là một nguồn hữu ích.

+1

Tôi đã tìm thấy lệnh 'sdist' (từ mâu thuẫn) phàn nàn về các đối số dòng lệnh không xác định nếu bạn thử loại điều này. – wutz

+0

Tôi vừa thử nghiệm điều này bằng tệp setup.py của dự án feedparser bằng cách sử dụng tùy chọn '--extras' để thay đổi tên của dự án (và do đó là tên tệp đầu ra). Nó hoạt động mà không có lỗi. Bạn đã thử sửa đổi 'sys.argv' trước khi gọi hàm' setup() 'chưa? –

+0

Đây là một giải pháp tốt đẹp và đơn giản, vì vậy +1 cho điều đó. Tôi nghĩ rằng wutz đã đề cập trước đó, rằng nó có thể tạo ra lệnh tùy chỉnh distutils. Dù sao cũng cảm ơn! – Constantinius

Các vấn đề liên quan