2010-07-24 2 views
9

Предположим, у нас есть программа под названием foo.Как обращаться с конфигурационными файлами с distutils для уважения FHS Unixen?

Если использовать абсолютный путь:

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

Тогда foo$ python setup.py --prefix=/usr/local и мы будем иметь /etc/foo.cfg. Но мы должны иметь /usr/local/etc/foo.cfg вместо FHS.

Что делать, если мы используем относительный путь?

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

Тогда если мы будем использовать по умолчанию путь установки, то есть установить в/USR, мы будем иметь /usr/etc/foo.cfg. Bad удачи снова.

Итак, как это сделать правильно?

P.S. Чтобы избежать сложностей проблемы, мы предполагаем, что эта программа foo не может работать в среде без UNIX.

ответ

5

Sub-причислять distutils.command.install.install не является строго необходимым. Вместо этого data_files может быть передан в setup, согласно документации distutils по адресу 'Installing Additional Files'.

например.

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

где conf_path рассчитывается в соответствии с вашими требованиями. т. е. построить его путем тестирования sys.prefix (вместо self.prefix), как это было сделано в @weakish.

5

Кажется, что нет простого способа. Проблема в том, что файлы конфигурации - это специальные данные файлов, и они заслуживают особого внимания.

Таким образом, написать свой собственный класс:

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 
    } 
)