我尝试在setuptools'build
期间实现Compass编译,但以下代码在显式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
之间复杂的关系。有谁知道如何在Python 2.7上install
期间进行自定义构建运行?
更新:发现install
肯定不会调用build
命令,但会调用运行bdist_egg
的{{1}}。好像我应该实现“Compass”构建扩展。
答案 0 :(得分:5)
不幸的是,我没有找到答案。似乎能够正确运行安装后脚本only at 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
所使用的命令,所以最正确的方式(特别是如果你想做{{} 1}} work)是覆盖easy_install
命令。整个代码:
bdist_egg
您可能会看到我如何使用此here.