Как обращаться с файлами конфигурации с помощью distutils, чтобы соблюдать FHS Unixen? - PullRequest
10 голосов
/ 24 июля 2010

Предположим, у нас есть программа с именем foo.

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

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. Плохой снова удачи.

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

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

Ответы [ 2 ]

5 голосов
/ 01 июля 2013

Подклассы distutils.command.install.install не являются строго необходимыми. Вместо этого data_files может быть передано setup, как указано в distutils документации по 'Установка дополнительных файлов' .

, например

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

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

5 голосов
/ 26 июля 2010

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

Итак, напишите наш собственный класс:

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