0

我可以从 django 管理命令调用 yui 压缩器:java -jar yuicompressor-xyzjar [options] [input file],如果可以,我该怎么做?

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

4

3 回答 3

4

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

  • INSTALLED APPS 中的应用
  • 正确的目录结构
  • 一个 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 的 INSTALLED APPS 中。

但是,Van 确实提出了一个很好的建议,即找到一种已经可以满足您需求的工具。:)

于 2009-11-12T23:13:07.420 回答
1

是的,但是您必须自己编写命令部分。解决这个问题的最好方法是查看股票命令是如何实现的,或者查看像django-command-extensions这样的项目

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

于 2009-11-12T23:07:36.740 回答
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)
于 2011-01-24T22:15:38.057 回答