2010-07-24 3 views
9

Załóżmy, że mamy program o nazwie foo.Jak radzić sobie z plikami konfiguracyjnymi z distutils, aby szanować system plików FHS uniksona?

Jeśli użycie ścieżka bezwzględna:

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

Następnie foo$ python setup.py --prefix=/usr/local i będziemy mieli /etc/foo.cfg. Ale powinniśmy mieć /usr/local/etc/foo.cfg zamiast tego zgodnie z FHS.

Co się stanie, jeśli użyjemy ścieżki względnej?

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

Następnie jeśli używamy domyślnej ścieżki instalacji, to zainstalować do katalogu/usr, będziemy mieć /usr/etc/foo.cfg. Złe Powodzenia.

Jak to zrobić, prawda?

P.S. Aby uniknąć komplikacji problemu, zakładamy, że ten program nie może działać w środowisku innym niż unix.

Odpowiedz

5

Sub-classing distutils.command.install.install nie jest to bezwzględnie konieczne. Zamiast tego data_files można przekazać do setup, zgodnie z dokumentacją na pod numerem 'Installing Additional Files'.

np.

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

gdzie conf_path jest obliczany zgodnie z własnymi wymaganiami. tj. skonstruuj go, testując sys.prefix (zamiast self.prefix), podobnie jak @weakish zrobił powyżej.

5

Wygląda na to, że nie ma łatwego sposobu. Problem polega na tym, że pliki konfiguracyjne są plikami specjalnymi i zasługują na specjalne traktowanie.

więc napisać własną klasę:

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 

wówczas:

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