Трубопровод Django, Heroku и SASS
Я пытаюсь настроить django-pipeline, чтобы я мог компилировать и конкатцировать мои активы. Я также хотел бы удалить скомпилированные файлы css из моего репозитория, чтобы избежать конфликтов слияния в запросах на pull.
Я пытаюсь получить django-конвейер для компиляции файлов как часть процесса развертывания, но не могу понять это. Я использую SASS для написания моего CSS. Настройки моего конвейера выглядят следующим образом:
STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'
PIPELINE_CSS = {
'main': {
'source_filenames': (
'sass/blah.scss',
'sass/main.scss',
),
'output_filename': 'css/main.css',
'extra_context': {
'media': 'screen',
},
},
}
PIPELINE_COMPILERS = (
'pipeline.compilers.sass.SASSCompiler',
)
Это отлично работает локально и создает файлы .css в папке /sass, которые затем объединяются для создания файла main.css. Если я проверю эти файлы CSS в моем репозитории git и нажимаю на Heroku, он также отлично работает. Однако, если я игнорирую их, что я хотел бы сделать так, чтобы я не компилировал файлы, тогда django-конвейер не может найти файлы для объединения. Я не уверен, как я могу собрать компиляцию sass, работающую на Heroku, и я ничего не могу найти об этом.
Я могу предоставить больше информации о моей настройке, если это необходимо, надеюсь, кто-то знает об этом!
Ответы
Ответ 1
ОК, вот как я получил эту работу, используя Compass, чтобы скомпилировать мои файлы SASS.
- Используйте несколько пакетов Heroku - Heroku Buildpack Multi
-
Поместите в файл .buildpacks следующее:
https://github.com/heroku/heroku-buildpack-ruby.git
https://github.com/heroku/heroku-buildpack-nodejs
https://github.com/heroku/heroku-buildpack-python.git
-
Создайте Gemfile с компасом и любыми другими требованиями, которые у вас есть. Здесь моя:
source 'https://rubygems.org'
ruby '1.9.3'
gem 'bootstrap-sass'
gem 'compass'
-
Создайте файл config.rb. Здесь моя. Как вы можете видеть, для этого требуется встроенный bootstrap-sass:
# Require any additional compass plugins here.
require 'bootstrap-sass'
# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "app_folder/static/css"
sass_dir = "app_folder/static/sass"
images_dir = "app_folder/static/images"
output_style = :compact
подробнее о config.rb можно найти здесь
-
Установите пакеты node (django-pipe хочет yuglify). Вам понадобится файл package.json:
{
"dependencies": {
"yuglify": "0.1.4"
},
"engines": {
"node": "0.10.x",
"npm": "1.3.x"
},
"repository": {
"type": "git",
"url": "your repo url"
}
}
- почти готов...
-
когда Heroku запускает ruby buildpack, он будет искать рейк-задачу под названием assets: precompile. Итак, теперь вам нужно добавить Rake файл со следующим:
namespace 'assets' do
desc 'Updates the stylesheets generated by Sass/Compass'
task :precompile do
print %x(compass compile --time)
end
end
это скомпилирует ваши таблицы стилей. Вам нужно убедиться, что вы устанавливаете вывод (обратно в config.rb) в место, где django-конвейер ищет файлы CSS (показано в исходном вопросе).
-
Вы должны избавиться от этой части в исходном вопросе, поскольку django-конвейер не компилирует ваш SASS для вас:
PIPELINE_COMPILERS = (
'pipeline.compilers.sass.SASSCompiler',
)
-
Это должно быть! Развертывания должны работать только сейчас, и это не добавило значительного количества времени на мой процесс развертывания.
В целом, это очень много настроек, но для меня это стоило того, что мне больше не нужно записывать скомпилированные файлы в репозиторий, что вызывало много конфликтов слияния при работе с ветвями и pull запросы.
Я хотел бы выяснить, как это сделать, используя только два buildpacks (очевидно, только один был бы идеальным, но я не знаю, если это возможно). Проблема заключается в попытке найти двоичные пути, чтобы конвейер мог это сделать, когда он не нашел значения по умолчанию. Я не уверен, причина, по которой я не могу это сделать, из-за того, как Heroku устанавливает вещи, или из-за ошибки в django-конвейере, но сейчас это достаточно хорошо для меня.
Если вы попробуете это, и это не сработает для вас, сообщите мне, если я пропустил что-то, я рад сделать обновления.
Ответ 2
Я не хочу отвлекаться от вашего прекрасного решения, но сегодня я попробовал это и нашел несколько отличий, которые сделали вещи проще для меня - вероятно, из-за обновлений в django-конвейере и/или Heroku. Мое полное решение ниже, в случае, если кто-то еще ищет.
Добавьте 3 шага к Heroku:
heroku buildpacks:set https://github.com/heroku/heroku-buildpack-ruby.git
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-nodejs
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-python.git
Добавьте django-конвейер и django-конвейер-компас в requirements.txt:
django-pipeline==1.5.2
django-pipeline-compass==0.1.5
Создайте Gemfile для установки Sass:
source 'https://rubygems.org'
ruby '2.1.5'
gem 'bootstrap-sass'
Создайте файл package.json для установки Yuglify:
{
"dependencies": {
"yuglify": "0.1.4"
},
"engines": {
"node": "0.10.x",
"npm": "1.4.x"
}
}
Мне не нужен Rakefile или config.rb.
Для справки, вот соответствующие настройки из моего settings.py:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, '_generated_media')
STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'pipeline.finders.PipelineFinder',
)
PIPELINE_COMPILERS = (
'pipeline_compass.compiler.CompassCompiler',
)
PIPELINE_YUGLIFY_BINARY = os.path.join(BASE_DIR, 'node_modules', '.bin', 'yuglify')
И мне также пришлось добавить эту запись в urls.py:
url(r'^static/(?P<path>.*)$', serve, kwargs={'document_root': settings.STATIC_ROOT})
Надеюсь, это поможет кому-то!
Ответ 3
Возможно, вам понадобится установить PIPELINE_SASS_BINARY
, чтобы django-конвейер мог найти ваш компилятор SASS.