我可以从django管理命令调用yui压缩器:java -jar yuicompressor-x.y.z.jar [options] [输入文件],如果是这样,我该怎么做呢?
我在Window上本地开发并在Linux上托管,所以这看起来像是一个适用于两者的解决方案。
答案 0 :(得分:4)
为了扩展Van Gale的答案,这肯定是可能的。以下是成分:
以下是一般的工作方式......
当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)