2010-07-24 13 views
9

foo adlı bir programımız olduğunu varsayalım.Konfigürasyon dosyalarını unixen'in FHS'lerine uymak için nasıl işlersiniz?

kullanımı mutlak yol ise:

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

Sonra foo$ python setup.py --prefix=/usr/local ve biz /etc/foo.cfg sahip olacaktır. Ancak FHS'a göre /usr/local/etc/foo.cfg olmalıdır. Biz göreli bir yol kullanırsam ne

? biz yüklemek yani yükleme yolu varsayılan kullanırsanız

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

Sonra/usr, biz /usr/etc/foo.cfg sahip olacaktır. Kötü tekrar şans.

Peki, nasıl yapmalı?

P.S. Sorunu daha karmaşık hale getirmekten kaçınmak için, bu programın foo unix dışı ortamlarda çalıştırılamayacağını varsayarız.

cevap

5

Alt classing distutils.command.install.install kesinlikle gerekli değildir

Yani, bizim kendi sınıf yazmak. Bunun yerine, data_files'Installing Additional Files' üzerinde distutils belgelendirmesi olarak, setup geçirilen edilebilir.

örn. Kendi gereksinimlerinize göre conf_path hesaplandığı

. Örneğin, @weakish'in yukarıda yaptığı gibi sys.prefix (self.prefix yerine) test ederek yapılandırın.

5

Kolay bir yol yok gibi görünüyor. Sorun, yapılandırma dosyalarının özel veri dosyalarıdır ve özel muameleyi hak etmeleridir. Sonra

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 

:

setup(# blah blah blah 
    conf_files = ['foo.cfg'] 
    cmdclass = {'install': myinstall, 
     # blah blah blah 
    } 
) 
İlgili konular