我可以从 django 管理命令调用 yui 压缩器:java -jar yuicompressor-xyzjar [options] [input file],如果可以,我该怎么做?
我在 Window 上本地开发并在 Linux 上托管,所以这似乎是一个适用于两者的解决方案。
我可以从 django 管理命令调用 yui 压缩器:java -jar yuicompressor-xyzjar [options] [input file],如果可以,我该怎么做?
我在 Window 上本地开发并在 Linux 上托管,所以这似乎是一个适用于两者的解决方案。
为了扩展范盖尔的答案,这肯定是可能的。以下是成分:
这通常是如何工作的......
当 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 确实提出了一个很好的建议,即找到一种已经可以满足您需求的工具。:)
是的,但是您必须自己编写命令部分。解决这个问题的最好方法是查看股票命令是如何实现的,或者查看像django-command-extensions这样的项目
然而,一个更好的解决方案(即更少的工作)是使用一个像django-compress这样的项目,它已经定义了一个synccompress
将调用 yui 压缩器的管理命令。
我最近在 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)