Использование Django конвейера browserify в Windows

Я пытаюсь подписаться на http://gregblogs.com/how-django-reactjs-and-browserify/. Я прошел через несколько обручей, чтобы получить collectstatic работает, но теперь работает без ошибок. Однако, когда я пытаюсь загрузить страницу, которая содержит мой реагирующий компонент, запускается другой процесс компиляции (я думал, что collectstatic предварительно обработает все, и ничего не нужно будет компилировать во время выполнения). Это требует некоторого взлома, чтобы заставить это работать прямо сейчас ( https://github.com/j0hnsmith/django-pipeline-browserify/issues/14). Но даже после этого патча, к сожалению, эта ошибка компиляции. Хотя команда теперь выглядит нормально: если я выполню

C:\Users\JohnSmith\node_modules\.bin\browserify.cmd -t babelify --deps C:\Users\JohnSmith\Documents\test\company\static\dashboard\js\react_test_dashboard_widget.browserify.js

он работает без ошибок и выдает зависимость JSON. Когда та же команда выполняется как подпроцесс Django/Pipeline, она выдает ошибку, говоря

Error: Cannot find module ' babelify' from 'C:\Users\JohnSmith\Documents\test\company

Как это побороть?

Фрагмент пакетов.json

"dependencies": {
  "babel-cli": "^6.6.5",
  "babel-preset-es2015": "^6.6.0",
  "yuglify": "^0.1.4",
  "babelify": "^7.3.0",
  "browserify": "^13.0.1",
  "jquery": "^2.2.0",
  "react": "^15.2.0"
},
"devDependencies": {
  "babel-plugin-transform-class-properties": "^6.10.2",
  "babel-plugin-transform-react-jsx": "^6.8.0",
  "babel-preset-es2016": "^6.11.0",
  "babel-preset-react": "^6.11.1"
}

фрагмент требований:

...
django-pipeline==1.6.6
django-pipeline-browserify==0.4.1
futures==3.0.5
...

Некоторые настройки (кстати, https://github.com/j0hnsmith/django-pipeline-browserify/issues/15):

PIPELINE["CSS_COMPRESSOR"] = "pipeline.compressors.NoopCompressor"
PIPELINE["JS_COMPRESSOR"] = "pipeline.compressors.NoopCompressor"
PIPELINE['SASS_BINARY'] = 'C:\\Ruby22-x64\\bin\\sass.bat'
PIPELINE['BABEL_BINARY'] = 'c:\\Users\\JohnSmith\\node_modules\\.bin\\babel.cmd'
PIPELINE['BROWSERIFY_BINARY'] = 'c:\\Users\\JohnSmith\\node_modules\\.bin\\browserify.cmd'
PIPELINE_BROWSERIFY_BINARY = PIPELINE['BROWSERIFY_BINARY']

if DEBUG:
    PIPELINE["BROWSERIFY_ARGUMENTS"] = '-t babelify'
    PIPELINE_BROWSERIFY_ARGUMENTS = PIPELINE["BROWSERIFY_ARGUMENTS"]

(последний нужен был для компиляторов!) Моя система: Win 10, Python 2.7, Django 1.8

Скажи мне, что еще я должен указать


Обновление: сообщение об ошибке исходит от самого узла. Смотрите стек вызовов ниже. Обратите внимание, что здесь я попытался явно указать JS-файл преобразования вместо имени модуля (это также хорошо работает из командной строки, но не очень хорошо в приложении):

CompilerError: ['c:\\Users\\JohnSmith\\node_modules\\.bin\\browserify.cmd', '-t  c:\\Users\\JohnSmith\\Documents\\test\\node_modules\\babelify\\index.js', u'--deps C:\\Users\\JohnSmith\\Documents\\test\\company\\static\\dashboard\\js\\react_test_dashboard_widget.browserify.js'] exit code 1
Error: Cannot find module '  c:\Users\JohnSmith\Documents\test\node_modules\babelify\index.js' from 'C:\Users\JohnSmith\Documents\test\company'
    at c:\Users\JohnSmith\node_modules\resolve\lib\async.js:46:17
    at process (c:\Users\JohnSmith\node_modules\resolve\lib\async.js:173:43)
    at ondir (c:\Users\JohnSmith\node_modules\resolve\lib\async.js:188:17)
    at load (c:\Users\JohnSmith\node_modules\resolve\lib\async.js:69:43)
    at onex (c:\Users\JohnSmith\node_modules\resolve\lib\async.js:92:31)
    at c:\Users\JohnSmith\node_modules\resolve\lib\async.js:22:47
    at FSReqWrap.oncomplete (fs.js:82:15)

Это подсказывает мне, что, возможно, проблема в том, что сам узел захватывает t параметр и не передает его browserify, Конечно, эта проблема может иметь решающее значение: https://github.com/j0hnsmith/django-pipeline-browserify/issues/14

Я перебил https://github.com/j0hnsmith/django-pipeline-browserify/blob/master/pipeline_browserify/compiler.py

    command = "%s %s %s --deps %s" % (
        getattr(settings, 'PIPELINE_BROWSERIFY_VARS', ''),
        getattr(settings, 'PIPELINE_BROWSERIFY_BINARY', '/usr/bin/env browserify'),
        getattr(settings, 'PIPELINE_BROWSERIFY_ARGUMENTS', ''),
        self.storage.path(infile),
    )

с

    command = (
        getattr(settings, 'PIPELINE_BROWSERIFY_BINARY', '/usr/bin/env browserify'),
        getattr(settings, 'PIPELINE_BROWSERIFY_ARGUMENTS', ''),
        "--deps %s" % self.storage.path(infile),
    )

потому что код компилятора конвейера ожидает кортежи. Исходя из исходного кода, он получил одну полную строку, но затем разбил ее на отдельные символы, думая, что все они являются аргументами, см. https://github.com/jazzband/django-pipeline/blob/master/pipeline/compilers/__init__.py

    argument_list = []
    for flattening_arg in command:
        if isinstance(flattening_arg, string_types):
            argument_list.append(flattening_arg)
        else:
            argument_list.extend(flattening_arg)

Это приведет к катастрофе позже:

CompilerError: [Error 87] The parameter is incorrect

1 ответ

Решение

Мой коллега тоже пытался заставить его работать на OSX, но мы сдались. Мы просто замкнули is_outdated всегда возвращать истину. is_outdated в любом случае содержит некоторую информацию в комментариях об этом ( https://github.com/j0hnsmith/django-pipeline-browserify/blob/master/pipeline_browserify/compiler.py):

"ПРЕДУПРЕЖДЕНИЕ. Мне кажется, что генерация зависимостей может занять столько же времени, сколько и фактическая компиляция, а это значит, что нам было бы лучше просто принудительно компилировать каждый раз".

Способ короткого замыкания - определить свой собственный компилятор и зарегистрировать его.

PIPELINE['COMPILERS'] = (
'pipeline.compilers.sass.SASSCompiler',
# 'pipeline_browserify.compiler.BrowserifyCompiler',
'company.utils.compilers.BrowserifyCompiler',
...
)

куда

class BrowserifyCompiler(BrowserifyCompiler):
    def is_outdated(self, infile, outfile):
        return True

Последний комментарий и тот факт, что никто раньше не жаловался на это, заставляют меня задуматься о состоянии проекта...

https://github.com/j0hnsmith/django-pipeline-browserify/issues/14

Другие вопросы по тегам