Django-compressor: Heroku์—์„œ ์ž‘๋™ํ•˜๊ฒŒ ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2014๋…„ 03์›” 06์ผ  ยท  24์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: django-compressor/django-compressor

์›น์—์„œ ๊ฒ€์ƒ‰ํ•˜๋ฉด heroku์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ์ง์ ‘์ ์ธ ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ S3์— ๋„ฃ๋Š” ๊ฒƒ์ด ํŒŒ์ผ์— ๋Œ€ํ•ด heroku๊ฐ€ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. http://django-compressor.readthedocs.org/en/latest/remote-storages/
๊ทธ๊ฒƒ์€ ๋ชจ๋‘ ๊ดœ์ฐฎ์ง€ ๋งŒ ๊ทธ๊ฒƒ์„ ํ•œ ํ›„์—๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. collectstatic, compress ๋‘˜ ๋‹ค ์‹คํ–‰ํ•ฉ๋‹ˆ๊นŒ? ๋กœ์ปฌ์—์„œ ํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด heroku ํ‘ธ์‹œ ํ›…์ด ๋Œ€์‹  ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๊นŒ? ๋˜๋Š” ์–ด์จŒ๋“  heroku ํ™˜๊ฒฝ์— lessc &co๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ heroku collectstatic์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ ์ ์–ด๋„ ์ด๊ฒƒ์€ ์ด ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋ฌธ์„œ ๋ฒ„๊ทธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค: http://django-compressor.readthedocs.org/en/latest/remote-storages/

์›์น™์ ์œผ๋กœ ์ด๊ฒƒ์€ ๋ชจ๋“  ๊ฒƒ์„ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๋ฒ„์ „ ๊ด€๋ฆฌ์— ์ฒดํฌ์ธํ•˜๋ฉด heroku์—์„œ๋„ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

heroku ํ™˜๊ฒฝ์—์„œ node ๋ฐ less ์„ค์ •์— ๋Œ€ํ•œ ๋‹ค์Œ ๊ธฐ์‚ฌ๊ฐ€ ์žˆ์ง€๋งŒ ์•ฝ๊ฐ„ ๊ณผ๋„ํ•ด ๋ณด์ด๋ฉฐ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
http://marklmiddleton.com/2013/using-less-with-django-on-heroku/
http://www.sore.nu/blog/2012/dec/30/fieldguide-django-bootstrap-less-coffeescript-and-/

์—ฌ๊ธฐ์— ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด์ œ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ฐ˜๋‚˜์ ˆ์„ ๋ณด๋‚ธ ํ›„ ์ €๋Š” ํฌ๊ธฐํ•ฉ๋‹ˆ๋‹ค(๋ช…ํ™•ํ•œ ๋Œ€์•ˆ์€ ํ‘œ์ค€ ํ”„๋ŸฐํŠธ ์—”๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์„ ๋กœ์ปฌ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค).

deployment

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ข‹์•„, ์—ฌ๊ธฐ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜๊ณ  dyno restart์—์„œ ์‚ด์•„๋‚จ์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚ด ์ฃผ์š” ๋ชฉํ‘œ๋Š” 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์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์ด๋…ธ ์žฌ์‹œ์ž‘์—์„œ ์‚ด์•„๋‚จ์œผ๋ ค๋ฉด.)

๋ชจ๋“  24 ๋Œ“๊ธ€

๋ฒ„๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค ;)

ํ•˜์ง€๋งŒ ์งˆ๋ฌธ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค ;)

  • ๋Œ€๋ถ€๋ถ„์˜ ๋กœ๋“œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” heroku์—์„œ ์ •์  ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด dj-static ( heroku ๋ฌธ์„œ ์ฐธ์กฐ) ๋˜๋Š” whitenoise ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉด ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•  ๋•Œ heroku๊ฐ€ collectstatic ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜คํ”„๋ผ์ธ ์••์ถ•์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์••์ถ•์„ ์‹คํ–‰ํ•˜๋Š” post_compile ์Šคํฌ๋ฆฝํŠธ( ์—ฌ๊ธฐ ์ฐธ์กฐ)๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ์—์„œ ์˜คํ”„๋ผ์ธ ์••์ถ•ํ•˜์ง€ ๋งˆ์„ธ์š”. heroku๊ฐ€ ์•Œ์•„์„œ ํ•˜๋„๋ก ํ•˜์„ธ์š”.
  • heroku์— lessc ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ์ž‘์—…์ž…๋‹ˆ๋‹ค. Google์—์„œ๋„ ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ๋งํฌ๋Š” ์œ ๋งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค(์ ์–ด๋„ post_compile ์Šคํฌ๋ฆฝํŠธ).

์œ„์˜ "์ •์  ํŒŒ์ผ ์‚ฌ์šฉ" ์•„๋ž˜์— ๋งํฌ๋œ ์„น์…˜์—์„œ ์ž์‹ ๋งŒ์˜ ์ €์žฅ์†Œ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์ด์œ ๋‚˜ ์ˆ˜ํ–‰ํ•œ ํ›„์— ํ•ด์•ผ ํ•  ์ž‘์—…์„ ์—ฌ์ „ํžˆ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

heroku์— lessc๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ฃผ์–ด์ง„ post_compile ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ง์ ‘ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋””๋ฒ„๊ทธํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์ง€๋ฃจํ•˜๊ณ  ์†”์งํžˆ ๋ชจ๋“  ๊ฒƒ๊ณผ ๋ถ€์—Œ ์‹ฑํฌ๋Œ€๊ฐ€ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šด์ง€ ๋†€๋ž์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋งํ•ด ์ค€๋‹ค๋ฉด: http://django-compressor.readthedocs.org/en/latest/remote-storages/
๋ฌธ์„œ ํŒจ์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” django-compressor, scss ์ปดํŒŒ์ผ, bower ๋ฐ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์ง€์›ํ•˜๋Š” django-skel ํฌํฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ํ™•์‹คํžˆ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

@therippa : ์ €๋„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Whitenoise๋Š” ์•ฑ์ด ๋กœ๋“œ๋  ๋•Œ๋งŒ ์ •์  ํด๋”๋ฅผ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์••์ถ•๊ธฐ์˜ ์˜จ๋ผ์ธ ๋ชจ๋“œ๋Š” Heroku์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ฌธ์ œ #680์— ๋Œ€ํ•œ ๋‚ด ์˜๊ฒฌ ์ฐธ์กฐ). ํ”„๋กœ๋•์…˜์—์„œ ์••์ถ•๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์˜คํ”„๋ผ์ธ ๋ชจ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  Heroku์˜ ํฌ์ŠคํŠธ ์ปดํŒŒ์ผ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์ด ๋กœ๋“œ๋˜๊ธฐ ์ „์— python manage.py compress ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Heroku๋Š” ์ž๋™์œผ๋กœ collect static์„ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. heroku-django-cookbook์ด ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Django/Heroku ์•ฑ์—์„œ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋…ธ๋“œ ๋“ฑ๋„ ์„ค์น˜ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํฌ์ŠคํŠธ ์ปดํŒŒ์ผ ํ›„ํฌ, ์‚ฌ์šฉ์ž ์ •์˜ pip ํŒจํ‚ค์ง€ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋นŒ๋“œ ํŒฉ์„ ํ†ตํ•ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํฌ์ŠคํŠธ ์ปดํŒŒ์ผ ํ›„ํฌ๊ฐ€ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์„ธํ‚ค์ž์ด์™€ ํ•จ๊ป˜ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜คํ”„๋ผ์ธ ์••์ถ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์˜ต์…˜์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ๋งค์šฐ ์‰ฝ๊ฒŒ ํ™•์žฅ๋˜๋Š” ํ™”์ดํŠธ๋…ธ์ด์ฆˆ๋ฅผ ์ˆ˜์ •ํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ ๋‚ด ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://gist.github.com/Chronial/45ce9f33615a3b24c51f

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฑฐ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ์™€ ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ™”์ดํŠธ๋…ธ์ด์ฆˆ์— ์ ์ ˆํ•œ PR์„ ๋ณด๋‚ด๊ณ  ์‹ถ์–ดํ• ๊นŒ์š”? :)

์ฐธ๊ณ : ์—ฌ์ „ํžˆ pre-generation ๋˜๋Š” heroku๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  post_build ํ›„ํฌ์—์„œ ์ผ๋ถ€ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Whitenoise ๋ฌธ์„œ๋Š” http://whitenoise.evans.io/en/stable/django.html#django -compressor์—์„œ django-compressor๋ฅผ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„์š”. ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ํ›Œ๋ฅญํ•˜๊ฒŒ ์ผํ–ˆ์Šต๋‹ˆ๋‹ค!
๋‚ด ๋ฃจํŠธ ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ(repo๋ผ๊ณ ๋„ ํ•จ) ์•ˆ์— 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 ๋ฅผ ์‹คํ–‰ํ–ˆ๊ณ  ๋‚ด ๋ชจ๋“  ํŒŒ์ผ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ์••์ถ•๋œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค!

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

์ข‹์•„, ์—ฌ๊ธฐ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜๊ณ  dyno restart์—์„œ ์‚ด์•„๋‚จ์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚ด ์ฃผ์š” ๋ชฉํ‘œ๋Š” 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์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์ด๋…ธ ์žฌ์‹œ์ž‘์—์„œ ์‚ด์•„๋‚จ์œผ๋ ค๋ฉด.)

@thatandromeda ์†”๋ฃจ์…˜์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@thatandromeda ์ด ์†”๋ฃจ์…˜์€ ๋‚ด๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(12์‹œ๊ฐ„ ๋™์•ˆ ์ˆ˜๋งŽ์€ ์‹œ๋„๋ฅผ ํ•œ ํ›„). bin/post_compile์€ ์ •ํ™•ํžˆ ์–ด๋””๋กœ ๊ฐ€๋‚˜์š”? ์–ด๋–ป๊ฒŒ ์ถ”๊ฐ€ํ• ๊นŒ์š”? heroku๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์–ด๋–ป๊ฒŒ ๋งํ•ฉ๋‹ˆ๊นŒ?

@manikos @thatandromeda collectstatic ์ „์ด๋‚˜ ํ›„์— ๋˜๋Š” compress ์ „ํ›„์— ๋ชจ๋‘ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚ด ์••์ถ• ๊ด€๋ฆฌ ๋ช…๋ น์— ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ValueError: The file 'css/font-awesome.min.css' could not be found with <whitenoise.storage.CompressedManifestStaticFilesStorage object at 0x7f3e3fc3b828>.

@typistX heroku์—๊ฒŒ ์•„๋ฌด ๊ฒƒ๋„ ๋งํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ(repo)์— bin ๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ๊ณ  post_compile (ํŒŒ์ผ ์—†์Œ)๋ผ๋Š” ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ์ž) ๋‚ด๋ถ€.

@thatandromeda ์ด ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ ์ง€ 3์ผ ๋งŒ์— ์ €๋ฅผ ๊ตฌํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ๐Ÿ™๐Ÿผ

์ด ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์–ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค / ๋„์™€๋“œ๋ฆด ์ˆ˜ ์žˆ์–ด์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค!

@technolingo ์••์ถ•์€ collectstatic ํ›„์— ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@thatandromeda ์™€ @manikos ์˜ ๋‘ ์†”๋ฃจ์…˜ ๋ชจ๋‘ ์ €๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ˜ƒ
์ด๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ์ง€๋งŒ Heroku์˜ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ๋ฌธ์„œ ์–ด๋”˜๊ฐ€์— ์–ธ๊ธ‰ํ•˜๋ฉด โ€‹โ€‹๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ๊ฐœ์„  ๋ฌธ์„œ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ๋ณ‘ํ•ฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ ์œ ์ง€ ๊ด€๋ฆฌ์ž ์ค‘ ๋ˆ„๊ตฌ๋„ heroku ๊ณ„์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ์„ ์ œ์•ˆํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ heroku์— ๋Œ€ํ•œ 1 ํด๋ฆญ ๋ฐฐํฌ ๋ฒ„ํŠผ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๊นŒ? ๋˜๋Š” heroku ๋ฐฐํฌ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๊นŒ?

@morenoh149 ๋‚ด ๋ณด๊ธฐ์— ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ํ•„์š”ํ•œ ๊ฒƒ์€ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. "1-ํด๋ฆญ ๋ฐฐํฌ ๋ฒ„ํŠผ"์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ _๋ฒ„๊ทธ_๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰