Трубопровод Django, Heroku и SASS

Я пытался получить django-трубопровод настройка, чтобы я мог компилировать и объединять свои активы. Я также хотел бы удалить скомпилированные css-файлы из моего репозитория, чтобы избежать конфликтов слияния в запросах pull.

Я пытался заставить django-pipeline скомпилировать файлы как часть процесса развертывания, но не могу понять это. Я использую 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 файлы в папке my /sass, которые затем объединяются, чтобы сделать основной.файл CSS. Если я проверю эти CSS-файлы в своем репозитории git и нажму на Heroku, он также отлично работает. Однако, если я игнорирую их, что я хотел бы сделать, чтобы я не фиксировал скомпилированные файлы, то django-pipeline не может найти файлы для объединения. Я не уверен, как я могу заставить компиляцию sass работать над Heroku, и я ничего не могу найти об этом.

Я могу предоставить больше информации о моей настройке, если это необходимо, надеюсь, кто-нибудь знает об этом!

3 ответов


хорошо, вот как я получил эту работу, используя компас для компиляции моих файлов SASS.

  • используйте несколько Heroku buildpacks -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'
    
  • создать конфиг.файл rb. Вот мой. Как видите это требует bootstrap-sass, который я включил в свой Gemfile:

    # 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
    

    подробнее о конфигурации.РБ можно найти здесь

  • установить пакеты узлов (django-pipeline хочет yuglify). Вам понадобится посылка.файл 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, он будет искать задачу rake под названием assets:precompile. Так что теперь вам нужно добавить Rakefile с следующий:

    namespace 'assets' do
      desc 'Updates the stylesheets generated by Sass/Compass'
      task :precompile do
        print %x(compass compile --time)
      end
    end
    

    это позволит скомпилировать ваш код. Вам нужно убедиться, что вы установили вывод (назад в config.rb) в то место, где django-pipeline ищет CSS-файлы (показано в исходном вопросе).

  • вы должны избавиться от этой части в исходном вопросе, поскольку django-pipeline не компилирует ваш SASS для вас:

    PIPELINE_COMPILERS = (
      'pipeline.compilers.sass.SASSCompiler',
    )
    
  • это должно быть оно! Развертывания должны просто работать сейчас, и это действительно не добавило значительное количество времени на процесс развертывания.

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

Я хотел бы выяснить, как это сделать, используя только два buildpacks (очевидно, только один был бы идеальным, но я не знаю, возможно ли это). Проблему пытается найдите двоичные пути, чтобы конвейер мог это сделать, когда он не находит значения по умолчанию. Я не уверен, что причина, по которой я не могу этого сделать, заключается в том, как Heroku устанавливает вещи, или потому, что есть ошибка в django-pipeline, но сейчас это достаточно хорошо для меня.

если вы попробуете это, и это не сработает для вас, дайте мне знать, если я пропустил что-то, я рад сделать обновления.


Я не хочу отнимать у вас отличное решение, но я попробовал это сегодня и нашел несколько отличий, которые сделали вещи проще для меня - вероятно, из-за обновлений в django-pipeline и/или Heroku. Мое решение ниже, в случае, если кто-нибудь придет.

добавить 3 buildpacks в 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-pipeline и django-pipeline-compass в требований.txt:

django-pipeline==1.5.2
django-pipeline-compass==0.1.5

создать Gemfile для установить Сасс:

source 'https://rubygems.org'
ruby '2.1.5'
gem 'bootstrap-sass'

создать .в JSON файл для установки Yuglify:

{
  "dependencies": {
    "yuglify": "0.1.4"
  },
  "engines": {
    "node": "0.10.x",
    "npm": "1.4.x"
  }
}

мне не нужно Rakefile или конфигурации.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})

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


вам может понадобиться set PIPELINE_SASS_BINARY чтобы django-pipeline мог найти ваш компилятор SASS.