Django collectstatic не работает с django-pipeline и yui-compressor

Я установил django-pipeline в своем приложении Django 1.4.1 под виртуальным окружением, но когда я запустить python manage.py collectstatic, я получаю:

Traceback (most recent call last):
  File "./manage.py", line 11, in <module>
    execute_manager(settings)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/django/core/management/__init__.py", line 459, in execute_manager
    utility.execute()
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 163, in handle_noargs
    collected = self.collect()
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 119, in collect
    dry_run=self.dry_run)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/pipeline/storage.py", line 30, in post_process
    packager.pack_stylesheets(package)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/pipeline/packager.py", line 90, in pack_stylesheets
    variant=package.variant, **kwargs)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/pipeline/packager.py", line 100, in pack
    content = compress(paths, **kwargs)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/pipeline/compressors/__init__.py", line 76, in compress_css
    css = getattr(compressor(verbose=self.verbose), 'compress_css')(css)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/pipeline/compressors/yui.py", line 14, in compress_css
    return self.compress_common(css, 'css', settings.PIPELINE_YUI_CSS_ARGUMENTS)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/pipeline/compressors/yui.py", line 8, in compress_common
    return self.execute_command(command, content)
  File "/home/hg/VIRTUALENVS/movie/lib/python2.6/site-packages/pipeline/compressors/__init__.py", line 235, in execute_command
    pipe.stdin.write(smart_str(content))
IOError: [Errno 32] Broken pipe

Мои настройки:

# static
STATIC_ROOT = join(REPOSITORY_ROOT, 'static_collected')
STATIC_URL = '/static/'
STATICFILES_DIRS = (join(REPOSITORY_ROOT, 'static'),)
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

# pipeline (css/js compression)
STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'
PIPELINE = True
PIPELINE_CSS = {
    'base_style': {
        'source_filenames': (
            'css/style.css',
            'css/effects.css',
            'css/rs_style.css',
            'css/jq/jquery-ui-movieplayer.css',
        ),
        'output_filename': 'CACHE/css/style.css',
    },
}

PIPELINE_JS = {
    'base_scripts': {
        'source_filenames': (
          'js/jq/jquery.js',
          'js/mv.core.js',
          'js/toolbox/toolbox.core.js',
          'js/swfobject.js',
          'swf/jwplayer5.9.2156.js',
          'js/jq/jquery-ui.custom.min.js',
          'js/mongo_autocomplete.js',
          'js/rs_script.js',
        ),
        'output_filename': 'CACHE/js/scripts.js',
    }
}

До добавления django-pipeline команда управления работала хорошо, она нашла все, поэтому это не проблема, связанная с поиском статических файлов или прав доступа к каталогу. Yuicompressor установлен глобально и находится в разделе /usr/local/bin/yuicompressor, поэтому я не менял PIPELINE_YUI_BINARY в своих настройках.

Любая подсказка? Благодарю вас!


person yliharma    schedule 24.08.2012    source источник
comment
Является ли какой-либо из этих файлов пустым?   -  person cyberdelia    schedule 25.08.2012
comment
нет, все они содержат хотя бы одну строку кода. Разница лишь в том, что некоторые из них уже минифицированы, а другие нет.   -  person yliharma    schedule 26.08.2012
comment
python manage.py findstatic css/style.css что-то возвращает?   -  person cyberdelia    schedule 31.08.2012
comment
Да, два файла: исходный файл в /static/css/style.css и фактический файл, который должен быть сжат в /static_collected/css/style.css (static_collected это STATIC_ROOT).   -  person yliharma    schedule 31.08.2012


Ответы (2)


IOError: [Errno 32] Broken pipe

Эта ошибка означает, что yuicompressor завершил работу до того, как мы успели отправить данные (чаще всего из-за сбоя или из-за того, что он не был найден). Проверьте свой путь yuicompressor и проверьте, действительно ли работает yuicompressor.

person cyberdelia    schedule 06.09.2012
comment
Хорошо понял! Это была проблема неправильного понимания плохого именования ... /usr/local/bin/yuicompressor, установленный с pip, - это всего лишь скрипт python, который вызывает файл jar Yuicompressor, пакет НЕ содержит фактическую библиотеку java. Банку нужно установить с помощью apt, и она называется yui-compressor... Я ненавижу, когда они используют почти одно и то же имя для совершенно разных вещей :( В любом случае, вероятно, теперь django-pipeline должен работать, но у меня нет времени проверить это, так как я уже перешли на этот компрессор github.com/jezdez/django_compressor Большое спасибо! - person yliharma; 07.09.2012

Добавьте пути к исполняемым файлам в настройках, например.

PIPELINE_YUI_BINARY = '/usr/bin/yui-compressor'
PIPELINE_LESS_BINARY = '/usr/local/lib/node_modules/less/bin/lessc' 

Пути могут отличаться (особенно для lessc, в этом примере less было установлено с помощью «npm install -g less»)

person Jey.ivanov    schedule 29.08.2012
comment
Компилятором Less я не пользуюсь, и путь компрессора yui такой же, как и в настройках по умолчанию (как я написал в своем вопросе), так что переопределять его в настройках не нужно... - person yliharma; 29.08.2012