2013-12-23 45 views
10

我一直試圖獲得django-pipeline的設置,以便我可以編譯和連接我的資產。我還想從存儲庫中刪除已編譯的css文件,以避免在請求中出現合併衝突。Django Pipeline,Heroku和SASS

我一直在試圖讓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', 
) 

這個本地的偉大工程,在我的/上海社會科學院的文件夾,然後將它們組合在一起構成的main.css文件生成.css文件。如果我將這些CSS文件檢入我的git存儲庫並推送到Heroku,它也可以正常工作。然而,如果我忽略它們,我想這樣做,我沒有提交編譯的文件,然後Django管道找不到要組合的文件。我不確定我如何才能在Heroku上使用sass編譯,但我無法找到任何有關它的信息。

如果需要,我可以提供更多關於我的設置的信息,希望有人知道這件事!

回答

8

好的,下面是我如何使用Compass來編譯我的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' 
    
  • 創建一個config.rb文件。這是我的。正如你可以看到它,需要引導,上海社會科學院,我包括在我的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 
    

    more details on config.rb can be found here

  • 安裝節點程序包(Django的管道要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運行紅寶石buildpack,它會尋找一個rake任務叫做資產:預編譯。所以現在你需要添加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的管道擺脫這部分沒有編譯您SASS給你:

    PIPELINE_COMPILERS = (
        'pipeline.compilers.sass.SASSCompiler', 
    ) 
    
  • 這應該是它!部署應該現在就工作了,它並沒有真正爲我的部署過程增加大量時間。

總而言之,它相當於很多設置的,但對我來說是值得的,因爲我再也不用工作時,編譯後的文件提交到庫中,這是造成了很多的合併衝突與分支和拉請求。

我想弄清楚如何使用只有兩個buildpacks(顯然只有一個會是理想的,但我不知道是否有可能)。問題是試圖找到二進制路徑,以便管道可以做它的事情,當它沒有找到默認值。我不確定我不能這樣做的原因是因爲Heroku如何安裝東西,或者是因爲django-pipeline中存在錯誤,但現在對我來說這已經足夠好了。

如果您嘗試此操作並且它不適用於您,請告訴我,如果我錯過了某項內容,我很樂意進行更新。

+0

我在試圖讓'django-compressor'編譯Heroku上的Zurb Foundation scss時發現了這個響應,並且使用它作爲參考!在我的情況下,因爲不需要node.js包,所以只能在multi-buildpack中引入ruby和python。Gemfile只需要有sass,然後不需要rake或config.rb。 Heroku將創建sass gem,然後是像'('text/x-scss','sass --scss {infile} {outfile}')這樣的django壓縮器預編譯器語句。感謝您提供有用的指導,幫助您做到這一點! – mirth23

+0

我不得不添加Gemfile.lock – dirk

0

您可能需要set PIPELINE_SASS_BINARY以便django-pipeline可以找到您的SASS編譯器。

+0

這可能是解決方案的一部分。雖然部分問題仍然是在Heroku上安裝一個sass編譯器,並找出它的路徑。 –

+0

我找到了一個使用多個buildpack的解決方案,所以你可以用ruby buildpack安裝sass gem,然後管道編譯器會自動提取它的位置。稍後我會更新完整回覆。 –

+0

我回來連接這個自己...不妨包括['heroku-buildpack-multi'](https://github.com/ddollar/heroku-buildpack-multi)的鏈接,因爲我在我的剪貼板。 – Chris

4

我不想從你的優秀解決方案中拿走,但是我今天嘗試了這個,發現了一些讓我更簡單的差異 - 可能是由於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的管道和Django的管道,指南針requirements.txt

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

創建的Gemfile安裝薩斯:

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" 
    } 
} 

我並不需要一個Rake文件config.rb

僅供參考,下面是我的settings.py相關設置:

​​

而且我也有這個條目添加到urls.py

url(r'^static/(?P<path>.*)$', serve, kwargs={'document_root': settings.STATIC_ROOT}) 

希望它幫助別人!

+0

感謝它,我只需要'sass'可執行文件,因此添加一個Gemfile,Gemfile.lock和ruby構建包讓我可以獲得'django-static-precompiler'並且在heroku上運行。 – Rebs