Как обрабатывать файлы конфигурации с помощью distutils для соблюдения FHS unixen?

StackOverflow https://stackoverflow.com/questions/3325606

  •  29-09-2020
  •  | 
  •  

Вопрос

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

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

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

Затем foo$ python setup.py --prefix=/usr/local и у нас будет /etc/foo.cfg.Но мы должны были /usr/local/etc/foo.cfg вместо этого, согласно ФХС.

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

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

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

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

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

Это было полезно?

Решение

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

например

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

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

Другие советы

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

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

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
  }
)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top