2010-07-24 3 views
9

Supposons que nous ayons un programme appelé foo.Comment gérer les fichiers de configuration avec distutils pour respecter le FHS d'unixen?

Si l'utilisation chemin absolu:

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

Alors foo$ python setup.py --prefix=/usr/local et nous aurons /etc/foo.cfg. Mais nous devrions avoir /usr/local/etc/foo.cfg à la place selon FHS. Que se passe-t-il si nous utilisons un chemin relatif?

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

Ensuite, si nous utilisons le chemin d'installation par défaut, à savoir installer dans/usr, nous aurons /usr/etc/foo.cfg. Bad encore une fois la chance.

Alors, comment le faire correctement?

P.S. Pour éviter de compliquer le problème, nous supposons que ce programme foo ne peut pas fonctionner dans un environnement non unix.

Répondre

5

Sous-distutils.command.install.install est classing pas strictement nécessaire. Au lieu de cela, data_files pourrait être passé à setup, conformément à la documentation distutils sur 'Installing Additional Files'.

par exemple.

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

conf_path est calculé selon vos besoins. c'est-à-dire, le construire en testant sys.prefix (au lieu de self.prefix), comme @weakish a fait ci-dessus.

5

Il semble qu'il n'y a pas de moyen facile. Le problème est que les fichiers de configuration sont des fichiers spéciaux de données et ils méritent un traitement spécial.

Alors, écrire notre propre 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 

Puis:

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