Трубопровод 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})

Надеюсь, это поможет кому-то!