2016-07-08 3 views
1

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

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. Когда же команда выполняется как подпроцесс Джанго/Pipeline, это ошибки, говоря

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

Как преодолеть это?

packages.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 
... 

Некоторые параметры (BTW 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

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


Update: сообщение об ошибке исходит от самого узла. См. Стек вызовов ниже. Обратите внимание, что здесь я попытался явно указать файл преобразования 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#L55

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#L108

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 

ответ

0

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

«ВНИМАНИЕ: Мне кажется, что просто генерации зависимостей может занять столько же времени, как на самом деле компиляции, что означало бы, мы бы лучше просто вынудив компиляция каждый раз ».

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

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

+0

Я следую тот же учебник и, похоже, не может заставить коллекцию работать. Я получаю следующую ошибку: «django/contrib/staticfiles/management/commands/collectstatic.py», строка 122, в наборе для исходного_path, обработанного_процесса, обработанного в процессоре: Файл «pipe/storage.py», строка 24 в post_process output_file = package.output_filename Файл "трубопровод/packager.py", строка 44, в выходной_файл возвратного self.config.get ('выходной_файл') AttributeError: 'кортеж' объект не имеет атрибута 'получить'. Хотите узнать, есть ли у вас подобная ошибка? – Rads

+0

@Rads, который не звонит в колокольчик. Я подозреваю, что ваша конфигурация трубопровода неисправна. Это (когда вы поставляете кортеж или не получаете кортеж, если ожидается) может быть причиной даже отсутствием запятой или дополнительной запятой. Это скорее похоже на дополнительную запятую где-то. Отправьте свою конфигурацию в вопрос и поставьте ссылку здесь, чтобы я мог следовать ей. Или просто поместите его в Gist и сообщите ссылку. –

+0

@Rads В вашем случае участвует 'browserify' или у вас есть только' конвейер'? У меня уже есть конфигурация рабочего конвейера, когда я ввел 'browserify' в уравнение. –

Смежные вопросы