Как обрабатывать файлы конфигурации с помощью distutils для соблюдения FHS unixen?
Вопрос
Предположим, у нас есть программа под названием 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
}
)