Webãæ€çŽ¢ããããšã¯ããããherokuã§æ©èœãããããã®ç°¡åãªæ¹æ³ã§ã¯ãªãããã§ãã
ç§ã¯ããã¡ã€ã«ã®herokuãæšå¥šããæ¹æ³ã§ããããã«ããã¹ãŠãS3ã«çœ®ãããšãé²ãã¹ãéã§ãããšèããŸããã ããããç§ã¯ãããèªã¿ãŸããïŒhttpïŒ //django-compressor.readthedocs.org/en/latest/remote-storages/
ããã¯ãã¹ãŠåé¡ãããŸãããããããå®è¡ããåŸã¯ãçµæãäœã§ãããã¯ããããŸããã collectstaticãcompressãäž¡æ¹ãå®è¡ããŸããïŒ ããŒã«ã«ã§å®è¡ããŸããããããšãherokuããã·ã¥ããã¯ã«å®è¡ãããŸããïŒ ãŸãã¯ããšã«ããherokuç°å¢ã«lesscïŒcoããªããããå®éã«herokucollectstaticãç¡å¹ã«ããŸããïŒ
ãããã£ãŠãå°ãªããšãããã¯ãã®ããŒãžã®ããã¥ã¡ã³ãã®ãã°ã«ãªããŸãïŒhttp: //django-compressor.readthedocs.org/en/latest/remote-storages/
ååãšããŠããã¹ãŠããªãã©ã€ã³ã§çæããŠããŒãžã§ã³ç®¡çã«ãã§ãã¯ã€ã³ããå Žåãããã¯herokuã§ãæ©èœããã¯ãã§ãã
herokuç°å¢ã§ã®ããŒã以äžã®ã»ããã¢ããã«é¢ãããããã®èšäºããããŸããããããã¯å°ãéå°ã«èŠããå®éã«ã¯æ©èœããŸããã
http://marklmiddleton.com/2013/using-less-with-django-on-heroku/
http://www.sore.nu/blog/2012/dec/30/fieldguide-django-bootstrap-less-coffeescript-and-/
ããã«äœã足ããªããã®ããããŸããïŒ æšæ¥ãã®æ¥ã«åæ¥ãè²»ãããåŸãç§ã¯ãããããŠããŸãïŒæ確ãªä»£æ¿æ段ã¯ãæšæºã®ããã³ããšã³ãããŒã«ã䜿çšããŠãã¹ãŠãããŒã«ã«ã§ã³ã³ãã€ã«ããããšã§ãïŒã
ãã°ã§ã¯ãããŸãã;ïŒ
ããããå€ãã®è³ªåããããŸãã;ïŒ
collectstatic
ãå®è¡ããŸãpost_compile
ã¹ã¯ãªããïŒãããåç
§ïŒãè¿œå ã§ããŸããlessc
ãherokuã«ã€ã³ã¹ããŒã«ããã®ã¯å¥ã®ã¿ã¹ã¯ã§ããç§ãã°ãŒã°ã«ã§è©ŠããŠã¿ãå¿
èŠããããŸããããããæåã®ãªã³ã¯ã¯ææã«èŠããŸãïŒå°ãªããšãpost_compileã¹ã¯ãªããïŒãäžèšã®ãéçãã¡ã€ã«ã®äœ¿çšãã®äžã«ãªã³ã¯ãããŠããã»ã¯ã·ã§ã³ã§ã¯ãç¬èªã®ã¹ãã¬ãŒãžãµãã¯ã©ã¹ãäœæããå¿ èŠãããçç±ããäœæåŸã«äœãããå¿ èŠãããã®ãââãŸã ããããŸããã
ç§ã¯herokuã«lesscãã€ã³ã¹ããŒã«ããããšããŸããããäžããããpost_compileã¹ã¯ãªãããçŽæ¥æ©èœããªãå Žåãããã¯ãããã°ããã®ãéåžžã«é¢åã§ãããççŽã«èšã£ãŠããã¹ãŠãšãããã³ã·ã³ã¯ãåããã³ã³ãããŒãäœæããã®ã¯è¯ãèããšã¯æããŸããã
ããããŸã ã©ãã»ã©é£ãããã«é©ããŠããŸããã誰ããããã§äœãèµ·ãã£ãŠããã®ãæããŠããããïŒhttp: //django-compressor.readthedocs.org/en/latest/remote-storages/
ããã¥ã¡ã³ãããããè¿œå ãããŠããã ããŸãã
django-compressorãscssã³ã³ãã€ã«ãbowerãããã³ãã®ä»ã®å€ãã®ãã®ããµããŒãããdjango-skelã®ãã©ãŒã¯ãäœæããŸããïŒãããŠãherokuã§å®è¡ããŸãïŒã 誰ãããããèŠãããšã«èå³ããããŸããïŒ
人ã ã¯ééããªãããŸããããã®ãèŠãããšæãã§ãããïŒ
@therippa ïŒç§ããããèŠãããšæããŸãã
Whitenoiseã¯ã¢ããªãããŒãããããšãã«ã®ã¿éçãã©ã«ããŒããã§ãã¯ãããããCompressorã®ãªã³ã©ã€ã³ã¢ãŒãã¯Herokuã§ã¯æ©èœããŸããïŒåé¡ïŒ680ã«é¢ããç§ã®ã³ã¡ã³ããåç
§ããŠãã ããïŒã æ¬çªç°å¢ã§ã³ã³ãã¬ããµãŒã䜿çšããã«ã¯ããªãã©ã€ã³ã¢ãŒãã§äœ¿çšããHerokuã®ã³ã³ãã€ã«åŸããã¯ã䜿çšããŠã¢ããªãèªã¿èŸŒãŸããåã«python manage.py compress
ãå®è¡ããå¿
èŠããããšæããŸãã Herokuã¯èªåçã«collectstaticãå®è¡ããã®ã§ãåé¡ã¯ãããŸããã heroku-django-cookbookã圹ã«ç«ã¡ãŸããã Django / Herokuã¢ããªã§TypeScriptã䜿çšããŠããã®ã§ãããŒããªã©ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãããããã¯ãã³ã³ãã€ã«åŸã®ããã¯ãã«ã¹ã¿ã pipããã±ãŒãžããŸãã¯ã«ã¹ã¿ã ãã«ãããã¯ãä»ããŠå¯èœã§ãã ã³ã³ãã€ã«åŸã®ããã¯ãæãç°¡åãªæ¹æ³ã ãšæããŸãã
sekizaiãšçµã¿åãããŠãã®åé¡ãçºçããããããªãã©ã€ã³å§çž®ã䜿çšããããšã¯å®éã«ã¯ãªãã·ã§ã³ã§ã¯ãããŸããã§ããã ãããããã®åé¡ã¯å®éã«ã¯ãã¯ã€ããã€ãºãæ¡åŒµããããšã§éåžžã«ç°¡åã«ä¿®æ£ã§ããã®ã§ãããã«ç§ã®è§£æ±ºçããããŸãïŒ https ://gist.github.com/Chronial/45ce9f33615a3b24c51f
誰ããããã«ããã€ãã®ãã¹ããšããã¥ã¡ã³ããè¿œå ããŠããã¯ã€ããã€ãºã«é©åãªPRãéä¿¡ããããšæããããããŸãããïŒ :)
泚ïŒäºåçæãŸãã¯herokuãå¿
èŠãªå Žåã¯ããµãŒããŒãèµ·åããŠã post_build
ããã¯ã§ããã€ãã®ãªã¯ãšã¹ããéä¿¡ã§ããŸãã
Whitenoiseã®ããã¥ã¡ã³ãã§ã¯ã httpïŒ //whitenoise.evans.io/en/stable/django.html#django-compressorã§django-compressorã«ã€ããŠèšåããŠããŸãã
ããã£ãã ããã¯ç§ã«ãšã£ãŠèŠäºã«æ©èœããŸããïŒ
ã«ãŒãããŒã«ã«ãã£ã¬ã¯ããªïŒå¥åãªããžããªïŒå
ã«ãã£ã¬ã¯ããªbin/
ãäœæãããã®äžã«post_compile
ãšããååã®ãã¡ã€ã«ãäœæããŸããã post_compile
ãã¡ã€ã«å
ã«ããããã®ããŒã¿ãã³ããŒããŠè²Œãä»ããŸããã
git add --all
ã git commit -m 'testing post_receive hook in Heroku'
ã git push heroku master
ããŸããã
Herokuã«ããcollectstatic
ã³ãã³ãã®èªåå®è¡åŸã python manage.py compress
ãå®è¡ããã1ã€ã®ãã¡ã€ã«ã«å§çž®ããããã¹ãŠã®ãã¡ã€ã«ãå«ããã£ã¬ã¯ããªãäœæãããŸããã
remote: $ python manage.py collectstatic --noinput
remote: 1247 static files copied to '/app/staticfiles'.
remote:
remote: -----> Running post-compile hook
remote: -----> Compressing static files
remote: Found 'compress' tags in:
remote: /app/templates/base/base.html
remote: /app/templates/info/areas.html
remote: /app/templates/info/profile.html
remote: Compressing... done
remote: Compressed 1 block(s) from 3 template(s) for 1 context(s).
ããªããOfflineCompressionErrorsãèŠãŠãããªãã人ã ãããå€ãã®åé¿çãææ¡ããŠããhttps://github.com/django-compressor/django-compressor/issues/443ããã§ãã¯ããŠãã ããã
ïŒ831ã®å Žåãæ©èœããã®ã¯ããŒã«ã«ã§ãªãã©ã€ã³å§çž®ãå®è¡ããmanifest.jsonãå«ãçµæãherokuã«ããã·ã¥ããããšã§ãã ãã ããS3ã¯ãããŸããã
ãããäœè ã®ããã«åãå¥ã®èšå®ã§ãïŒ https ïŒ//github.com/django-compressor/django-compressor/issues/855#issuecomment -303294202
OKããããç§ã®ããã«åããŠããŠãdynoã®åèµ·åãçã延ã³ããã®ã§ãã ããã§ã®ç§ã®äž»ãªç®æšã¯ã1ïŒã¢ã»ãããã€ãã©ã€ã³ã®ããã ãã«ruby/JSãã«ãããã¯ã®ç¶æ³å šäœãè¿œå ããå¿ èŠããªãããšã§ããã 2ïŒS3ãèšå®ããå¿ èŠã¯ãããŸããã 3ïŒããŒã«ã«æé ãå¿ èŠãšããã«ãå±éã®äžéšãšããŠèªåçã«å®è¡ãããããã«ããŸãã
ããã§ïŒ
1ïŒHerokuã®æ瀺ã«åŸã£ãŠãã¯ã€ããã€ãºãæ§æããŸãã
2ïŒèŠä»¶ã«django-libsass
ãè¿œå ããŸãã
3ïŒèšå®ãã¡ã€ã«ïŒ
INSTALLED_APPS += ('compressor',)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'compressor.finders.CompressorFinder',
)
COMPRESS_ENABLED = True
COMPRESS_OFFLINE = True
COMPRESS_PRECOMPILERS = (
('text/x-sass', 'django_libsass.SassCompiler'),
('text/x-scss', 'django_libsass.SassCompiler'),
)
4ïŒãå«ãbin/post_compile
ãã¡ã€ã«ãè¿œå ããŸã
python manage.py compress
python manage.py collectstatic --noinput
ïŒããã¯post_compileã«ããå¿ èŠãããããšã«æ³šæããŠãã ãããäžæçãªãã¡ã€ã«ã·ã¹ãã ã®ããããªãªãŒã¹ã¿ã¹ã¯ã«ããããšã¯ã§ããŸããããªãªãŒã¹ã¿ã¹ã¯ã§å®è¡ããå Žåãå§çž®äžã«çæããããã¡ã€ã«ã¯æ®ããŸãããããããpost_compileã§å®è¡ãããšæ©èœããããã§ãã dynoã®åèµ·åãçãæ®ãããã«ãïŒ
@thatandromedaãœãªã¥ãŒã·ã§ã³ã¯ç§ã®ããã«åããŸãããã©ããããããšãïŒ
@thatandromedaãã®ãœãªã¥ãŒã·ã§ã³ã¯ç§ãæ¢ããŠãããã®ãããããŸããïŒ12æéããããã®ããšãè©ŠããåŸïŒã bin / post_compileã¯æ£ç¢ºã«ã©ãã«è¡ããŸããïŒ ã©ãããã°è¿œå ã§ããŸããïŒ herokuã«äœ¿çšããããã«æ瀺ããã«ã¯ã©ãããã°ããã§ããïŒ
@manikos @thatandromeda $ïŒ$ 1 compress
ïŒ$ã®åãŸãã¯åŸããããã¯ãã®ååŸã®äž¡æ¹ã§collectstatic
ãå®è¡ããå¿
èŠããããŸããïŒ ç§ã®å§çž®ç®¡çã³ãã³ãã¯ããã¡ã€ã«ãèŠã€ãããŸãããšèšã£ãŠããŸãïŒ
ValueError: The file 'css/font-awesome.min.css' could not be found with <whitenoise.storage.CompressedManifestStaticFilesStorage object at 0x7f3e3fc3b828>.
@typistX herokuã«äœãäŒããå¿
èŠã¯ãããŸããããããžã§ã¯ãã®ã«ãŒãïŒãªããžããªïŒã«bin
ãšãããã£ã¬ã¯ããªããããã©ããã post_compile
ãšãããã¡ã€ã«ããããã©ããïŒãã¡ã€ã«ãªãïŒãèªåçã«æ€åºãããŸããæ¡åŒµïŒå
éšã
@thatandromedaããªãã¯ãã®ãããããæ±ã£ãŠ3æ¥åŸã«ç§ãæã£ãã ððŒ
ç³ãèš³ãããŸãããããã®èŠåŽããããŸã/ç§ãå©ããããšãã§ããŠããããã§ãïŒ
@technolingo compressã¯ãcollectstaticã®åŸã«å®è¡ããå¿ èŠããããŸãã
@thatandromedaãš@manikosã®äž¡æ¹ã®ãœãªã¥ãŒã·ã§ã³ãç§ã®ããã«åãããããããšãïŒ ð
ããã¯ãã°ã§ã¯ãªãããšã確èªãããŠããŸãããHerokuã§ã®å±éããã»ã¹ã«é¢ããæ
å ±ãäžè¶³ããŠããã ãã§ãããã¥ã¡ã³ãã®ã©ããã«èšèŒãããŠãããšåœ¹ã«ç«ã¡ãŸãã
ããã¥ã¡ã³ããæ¹åãããã«ãªã¯ãšã¹ãã確èªããŠããŒãžãããŠããã ããŸãã ã¢ã¯ãã£ããªã¡ã³ããã¯èª°ãherokuã¢ã«ãŠã³ããæã£ãŠããªãã®ã§ãããã¯å®éã«ã¯å€æŽãææ¡ãããŠãŒã¶ãŒæ¬¡ç¬¬ã§ãã
ããã§ã¯ãherokuãžã®ã¯ã³ã¯ãªãã¯ãããã€ãã¿ã³ãæè¿ããŸããïŒ ãããšããherokuã®ãããã€ãã¹ãããã¹ã«ãŒããããã¥ã¡ã³ãã§ããïŒ
@ morenoh149ç§ã®èŠè§£ã§ã¯ãããã§æãå¿ èŠãªã®ã¯ããã¥ã¡ã³ãã§ãããã¯ã³ã¯ãªãã¯ãããã€ãã¿ã³ãã圹ç«ã€ãããããŸãããã_ãã°_ãæ€çŽ¢ããŠãããšãã«ãåé¡ãæ£ç¢ºã«äœã§ããããç¥ããããšæããŸããã
æãåèã«ãªãã³ã¡ã³ã
OKããããç§ã®ããã«åããŠããŠãdynoã®åèµ·åãçã延ã³ããã®ã§ãã ããã§ã®ç§ã®äž»ãªç®æšã¯ã1ïŒã¢ã»ãããã€ãã©ã€ã³ã®ããã ãã«ruby/JSãã«ãããã¯ã®ç¶æ³å šäœãè¿œå ããå¿ èŠããªãããšã§ããã 2ïŒS3ãèšå®ããå¿ èŠã¯ãããŸããã 3ïŒããŒã«ã«æé ãå¿ èŠãšããã«ãå±éã®äžéšãšããŠèªåçã«å®è¡ãããããã«ããŸãã
ããã§ïŒ
1ïŒHerokuã®æ瀺ã«åŸã£ãŠãã¯ã€ããã€ãºãæ§æããŸãã
2ïŒèŠä»¶ã«
django-libsass
ãè¿œå ããŸãã3ïŒèšå®ãã¡ã€ã«ïŒ
4ïŒãå«ã
bin/post_compile
ãã¡ã€ã«ãè¿œå ããŸãïŒããã¯post_compileã«ããå¿ èŠãããããšã«æ³šæããŠãã ãããäžæçãªãã¡ã€ã«ã·ã¹ãã ã®ããããªãªãŒã¹ã¿ã¹ã¯ã«ããããšã¯ã§ããŸããããªãªãŒã¹ã¿ã¹ã¯ã§å®è¡ããå Žåãå§çž®äžã«çæããããã¡ã€ã«ã¯æ®ããŸãããããããpost_compileã§å®è¡ãããšæ©èœããããã§ãã dynoã®åèµ·åãçãæ®ãããã«ãïŒ