2010-07-24 31 views
9

Giả sử chúng tôi có một chương trình có tên là foo.Làm cách nào để xử lý các tệp cấu hình có méo để tôn trọng FHS của unixen?

Nếu sử dụng tuyệt đối đường dẫn:

setup(..., 
     data_files=[..., 
       ('/etc', ['foo.cfg'])] 
) 

Sau đó foo$ python setup.py --prefix=/usr/local và chúng tôi sẽ có /etc/foo.cfg. Nhưng chúng tôi phải có /usr/local/etc/foo.cfg thay vì theo FHS.

Nếu chúng ta sử dụng đường dẫn tương đối thì sao?

setup(..., 
     data_files=[..., 
       ('etc', ['foo.cfg'])] 
) 

Sau đó, nếu chúng tôi sử dụng đường dẫn cài đặt mặc định, tức là cài đặt vào/usr, chúng tôi sẽ có /usr/etc/foo.cfg. Bad may mắn lần nữa.

Vậy làm cách nào để thực hiện đúng?

P.S. Để tránh làm cho vấn đề phức tạp hơn, chúng tôi giả định rằng chương trình này foo không thể chạy trong môi trường không Unix.

Trả lời

5

Sub-classing distutils.command.install.install là không thực sự cần thiết. Thay vào đó, data_files có thể được chuyển đến setup, theo tài liệu distutils trên 'Installing Additional Files'.

ví dụ:

setup(
    ... 
    data_files = [ 
     (conf_path, ['foo.cfg']) 
    ] 
) 

nơi conf_path được tính theo yêu cầu của riêng bạn. tức là xây dựng nó bằng cách thử nghiệm sys.prefix (thay vì self.prefix), như @weakish đã làm ở trên.

5

Dường như không có cách nào dễ dàng. Vấn đề là các tập tin cấu hình là các tập tin dữ liệu đặc biệt và chúng xứng đáng được xử lý đặc biệt.

Vì vậy, hãy viết lớp của chúng ta:

class myinstall(distutils.command.install.install): 
    if self.prefix == '/usr': 
     self.conf_prefix = '/etc' 
    else: 
     self.conf_prefix = self.prefix + '/etc' 

    install.finalize_options(self) 

    def install_conf(self): 
     self.mkpath((self.root or '') + self.conf_prefix) 
     for file in self.distribution.conf_files: 
     dest = (self.root or '') + self.conf_prefix + '/' + 
      os.path.basename(file) 
     self.copy_file(file, dest) 

    # blah blah blah 

Sau đó:

setup(# blah blah blah 
    conf_files = ['foo.cfg'] 
    cmdclass = {'install': myinstall, 
     # blah blah blah 
    } 
) 
Các vấn đề liên quan