django管理命令+ yui压缩器

时间:2009-11-12 22:38:44

标签: django yui-compressor

我可以从django管理命令调用yui压缩器:java -jar yuicompressor-x.y.z.jar [options] [输入文件],如果是这样,我该怎么做呢?

我在Window上本地开发并在Linux上托管,所以这看起来像是一个适用于两者的解决方案。

3 个答案:

答案 0 :(得分:4)

为了扩展Van Gale的答案,这肯定是可能的。以下是成分:

  • 处于安装的应用程序中的应用程序
  • 正确的目录结构
  • 一个python文件,用作继承Django管理命令类的命令

以下是一般的工作方式......

当manage.py运行时,如果找不到命令“manage.py yui_compress”,它会搜索已安装的应用程序。它会查看每个应用程序以查看app.management.commands是否存在,然后检查该模块中是否存在“yui_compress.py”文件。如果是这样,它将在该python文件中启动该类并使用它。

所以,它最终看起来像这样......

app
   \management
        \commands
            yui_compress.py

yui_compress.py包含...

from django.core.management.base import NoArgsCommand

class Command(NoArgsCommand):
    help = "Does my special action."
    requires_model_validation = False

    def handle_noargs(self, **options):
        # Execute whatever code you want here
        pass

当然'app'需要在settings.py中的安装APPS中。

然而,范确实提出了一个很好的建议,找到一个已经做你想要的工具。 :)

答案 1 :(得分:1)

是的,但您必须自己编写命令部分。解决这个问题的最佳方法是查看股票指令的实施方式或查看django-command-extensions等项目

然而,一个更好的解决方案(即工作量更少)将是使用像django-compress这样的项目,它已经定义了一个将调用yui压缩器的管理命令synccompress

答案 2 :(得分:0)

我最近在django-mediasync中添加了一个YUI Compressor处理器。

如果你想使用django-mediasync本身,这是项目页面: https://github.com/sunlightlabs/django-mediasync

如果你想看YUI Compressor命令作为参考,这里有一个复制/粘贴(如果将来路径发生变化)......

from django.conf import settings
import os
from subprocess import Popen, PIPE

def _yui_path(settings):
    if not hasattr(settings, 'MEDIASYNC'):
        return None
    path = settings.MEDIASYNC.get('YUI_COMPRESSOR_PATH', None)
    if path:
        path = os.path.realpath(os.path.expanduser(path))
    return path

def css_minifier(filedata, content_type, remote_path, is_active):
    is_css = (content_type == 'text/css' or remote_path.lower().endswith('.css'))
    yui_path = _yui_path(settings)
    if is_css and yui_path and is_active:
        proc = Popen(['java', '-jar', yui_path, '--type', 'css'], stdout=PIPE,
                     stderr=PIPE, stdin=PIPE)
        stdout, stderr = proc.communicate(input=filedata)
        return str(stdout)

def js_minifier(filedata, content_type, remote_path, is_active):
    is_js = (content_type == 'text/javascript' or remote_path.lower().endswith('.js'))
    yui_path = _yui_path(settings)
    if is_js and yui_path and is_active:
        proc = Popen(['java', '-jar', yui_path, '--type', 'js'], stdout=PIPE,
                     stderr=PIPE, stdin=PIPE)
        stdout, stderr = proc.communicate(input=filedata)
        return str(stdout)