Запуск пользовательских сборок 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,
    },
)

Вы можете увидеть, как я использовал это здесь.

Другие вопросы по тегам