2010-07-24 8 views
9

Supponiamo di avere un programma chiamato foo.Come gestire i file di configurazione con distutils per rispettare FHS di unixen?

Se l'uso percorso assoluto:

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

Poi foo$ python setup.py --prefix=/usr/local e avremo /etc/foo.cfg. Ma dovremmo avere /usr/local/etc/foo.cfg invece in base a FHS.

E se usassimo un percorso relativo?

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

Poi se usiamo il default percorso di installazione, vale a dire installare in/usr, avremo /usr/etc/foo.cfg. Cattiva fortuna di nuovo.

Quindi, come farlo nel modo giusto?

P.S. Per evitare di complicare ulteriormente il problema, supponiamo che questo programma foo non possa essere eseguito in ambiente non unix.

risposta

5

Sotto classing distutils.command.install.install non è strettamente necessario. Invece, data_files potrebbe essere passato a setup, come da documentazione su 'Installing Additional Files'.

ad es.

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

dove conf_path è calcolato secondo le proprie esigenze. per esempio costruiscilo testando sys.prefix (invece di self.prefix), come @weakish ha fatto sopra.

5

Sembra che non ci sia un modo semplice. Il problema è che i file di configurazione sono dati speciali e meritano un trattamento speciale.

Quindi, scrivere la nostra classe:

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 

Poi:

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