Cant compress files with django-pipeline and YUI
-
19-06-2021 - |
Question
When I run python manage.py collectstatic, I get:
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/Users/fceruti/Development/Arriendas.cl/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
utility.execute()
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
self.execute(*args, **options.__dict__)
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
output = self.handle(*args, **options)
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle
return self.handle_noargs(**options)
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 163, in handle_noargs
collected = self.collect()
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 119, in collect
dry_run=self.dry_run)
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/pipeline/storage.py", line 30, in post_process
packager.pack_stylesheets(package)
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/pipeline/packager.py", line 90, in pack_stylesheets
variant=package.variant, **kwargs)
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/pipeline/packager.py", line 100, in pack
content = compress(paths, **kwargs)
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/pipeline/compressors/__init__.py", line 72, in compress_css
css = self.concatenate_and_rewrite(paths, output_filename, variant)
File "/Users/fceruti/Development/Arriendas.cl/venv/lib/python2.7/site-packages/pipeline/compressors/__init__.py", line 135, in concatenate_and_rewrite
content = self.read_file(path)
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/pipeline/compressors/__init__.py", line 208, in read_file
file = default_storage.open(path, 'rb')
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/django/core/files/storage.py", line 33, in open
return self._open(name, mode)
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/pipeline/storage.py", line 114, in _open
storage = self.find_storage(name)
File "/Users/fceruti/Development/xxxxx/venv/lib/python2.7/site-packages/pipeline/storage.py", line 111, in find_storage
raise ValueError("The file '%s' could not be found with %r." % (name, self))
ValueError: The file 'css/960_24_col.css' could not be found with <pipeline.storage.PipelineFinderStorage object at 0x101da4d50>.
When I run python manage.py findstatic css/960_24_col.css, I get
Found 'css/960_24_col.css' here:
/Users/fceruti/Development/xxxxxxx/Arriendas/static/css/960_24_col.css
My settings are:
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
STATICFILES_DIRS = (
('css', os.path.join(STATIC_ROOT, 'css')),
('img', os.path.join(STATIC_ROOT, 'img')),
('js', os.path.join(STATIC_ROOT, 'js')),
('fonts', os.path.join(STATIC_ROOT, 'fonts')),
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
PIPELINE = True
PIPELINE_CSS = {
'app': {
'source_filenames': (
'css/960_24_col.css',
'css/base.scss',
),
'output_filename': 'css/app.css',
'extra_context': {
'media': 'screen,projection',
},
},
}
PIPELINE_CSS_COMPRESSOR = 'pipeline.compressors.yui.YUICompressor'
PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.yui.YUICompressor'
PIPELINE_YUI_CSS_ARGUMENTS = ''
PIPELINE_YUI_JS_ARGUMENTS = ''
PIPELINE_YUI_BINARY = os.path.join(PROJECT_ROOT, 'libs/yuicompressor-2.4.7/build/yuicompressor-2.4.7.jar')
STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'
PIPELINE_SASS_BINARY = '/usr/bin/sass'
When I add
PIPELINE_COMPILERS = (
'pipeline.compilers.sass.SASSCompiler',
)
And run the webpage, I get:
Exception Type: CompilerError
Exception Value:
Unable to apply SASSCompiler compiler
What am I doing wrong?
EDIT:
The softwares I'm using are:
- Sass 3.1.19 (Brainy Betty)
- YUI compressor 2.4.7
- django-pipeline==1.2.11
- Django 1.4
Solution
First, You should not put the jar as PIPELINE_YUI_BINARY
, but you should point to a script that call the jar with java (most of the time, it's bundle with it when packaged). It looks like this :
#!/bin/sh
java -jar "/path/to/yuicompressor-2.4.7.jar" $@
OTHER TIPS
I think you want your STATICFILES_DIRS to look something like this:
STATICFILES_DIRS = ('./static/')
If that doesn't work, try something like this.
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)[0: (os.path.dirname(__file__).rindex(os.sep + 'src' + os.sep))])
STATICFILES_DIRS = (os.path.join(PROJECT_ROOT, 'static/' ))
(the idea is to set PROJECT_ROOT to the top level directory for your app)
The way you have it set up it will look in each of your sub directories for "css/960_24_col.css" In other words it will look for
- STATIC_ROOT/css/css/960_24_col.css
- STATIC_ROOT/img/css/960_24_col.css
- STATIC_ROOT/js/css/960_24_col.css
- STATIC_ROOT/fonts/css/960_24_col.css
And it won't find it, because the file is at
STATIC_ROOT/css/960_24_col.css
In general, STATICFILES_DIRS is a collection of /static/ directories that are contained in different apps. If yourApp includes myApp, and myApp has a static directory you'd put both yourApp's static dir and myApps static dir on the list. Collectstatic will combine them into STATIC_ROOT and then run Pipeline on that.