Запуск пользовательских сборок setuptools во время установки
Я пытался реализовать компас компиляции во время установки ' build
, но следующий код выполняет компиляцию во время явного build
команда и не работает во время install
,
#!/usr/bin/env python
import os
import setuptools
from distutils.command.build import build
SETUP_DIR = os.path.dirname(os.path.abspath(__file__))
class BuildCSS(setuptools.Command):
description = 'build CSS from SCSS'
user_options = []
def initialize_options(self):
pass
def run(self):
os.chdir(os.path.join(SETUP_DIR, 'django_project_dir', 'compass_project_dir'))
import platform
if 'Windows' == platform.system():
command = 'compass.bat compile'
else:
command = 'compass compile'
import subprocess
try:
subprocess.check_call(command.split())
except (subprocess.CalledProcessError, OSError):
print 'ERROR: problems with compiling Sass. Is Compass installed?'
raise SystemExit
os.chdir(SETUP_DIR)
def finalize_options(self):
pass
class Build(build):
sub_commands = build.sub_commands + [('build_css', None)]
setuptools.setup(
# Custom attrs here.
cmdclass={
'build': Build,
'build_css': BuildCSS,
},
)
Любые пользовательские инструкции на Build.run
(например, некоторая печать) не применяется во время install
тоже, но dist
экземпляр содержится в commands
приписывать только мой build
экземпляры реализации команды. Невероятно! Но я думаю, что проблема в сложных отношениях между setuptools
а также distutils
, Кто-нибудь знает, как заставить пользовательское здание работать во время install
на Python 2.7?
Обновление: обнаружил, что install
определенно не звонит build
команда, но она вызывает bdist_egg
который работает build_ext
, Похоже, я должен реализовать расширение сборки "Compass".
1 ответ
К сожалению, я не нашел ответа. Похоже, что возможность правильно запускать сценарии после установки есть только в Distutils 2. Теперь вы можете использовать этот обходной путь:
Обновление: из-за проверок стека в setuptools, мы должны переопределить install.do_egg_install
не run
метод:
from setuptools.command.install import install
class Install(install):
def do_egg_install(self):
self.run_command('build_css')
install.do_egg_install(self)
Update2: easy_install
работает точно bdist_egg
команда, которая используется install
тоже, так что самый правильный путь (особенно если вы хотите сделать easy_install
работа) это переопределить bdist_egg
команда. Весь код:
#!/usr/bin/env python
import setuptools
from distutils.command.build import build as _build
from setuptools.command.bdist_egg import bdist_egg as _bdist_egg
class bdist_egg(_bdist_egg):
def run(self):
self.run_command('build_css')
_bdist_egg.run(self)
class build_css(setuptools.Command):
description = 'build CSS from SCSS'
user_options = []
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
pass # Here goes CSS compilation.
class build(_build):
sub_commands = _build.sub_commands + [('build_css', None)]
setuptools.setup(
# Here your setup args.
cmdclass={
'bdist_egg': bdist_egg,
'build': build,
'build_css': build_css,
},
)
Вы можете увидеть, как я использовал это здесь.