์น์์ ๊ฒ์ํ๋ฉด 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-/
์ฌ๊ธฐ์ ๋๋ฝ๋ ๊ฒ์ด ์์ต๋๊น? ์ด์ ์ด๊ฒ์ ๋ํด ๋ฐ๋์ ์ ๋ณด๋ธ ํ ์ ๋ ํฌ๊ธฐํฉ๋๋ค(๋ช ํํ ๋์์ ํ์ค ํ๋ฐํธ ์๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฒ์ ๋ก์ปฌ๋ก ์ปดํ์ผํ๋ ๊ฒ์ ๋๋ค).
๋ฒ๊ทธ๊ฐ ์๋๋๋ค ;)
ํ์ง๋ง ์ง๋ฌธ์ด ๋ง์์ต๋๋ค ;)
collectstatic
๋ฅผ ์คํํฉ๋๋ค.post_compile
์คํฌ๋ฆฝํธ( ์ฌ๊ธฐ ์ฐธ์กฐ)๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.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-ํด๋ฆญ ๋ฐฐํฌ ๋ฒํผ"์ด ๋์์ด ๋ ์ ์์ง๋ง _๋ฒ๊ทธ_๋ฅผ ๊ฒ์ํ ๋ ๋ฌธ์ ๊ฐ ์ ํํ ๋ฌด์์ธ์ง ์๊ณ ์ถ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ข์, ์ฌ๊ธฐ ๋๋ฅผ ์ํด ์๋ํ๊ณ dyno restart์์ ์ด์๋จ์ ๊ฒ์ด ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ด ์ฃผ์ ๋ชฉํ๋ 1) ์์ฐ ํ์ดํ๋ผ์ธ์ ๋ํด์๋ง ์ ์ฒด ruby/JS ๋น๋ํฉ ์ํฉ์ ์ถ๊ฐํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. 2) S3๋ฅผ ์ค์ ํ ํ์๊ฐ ์์ต๋๋ค. 3) ๋ก์ปฌ ๋จ๊ณ๋ฅผ ์๊ตฌํ์ง ์๊ณ ๋ฐฐํฌ์ ์ผ๋ถ๋ก ์๋์ผ๋ก ๋ฐ์ํ๋๋ก ํฉ๋๋ค.
๊ทธ๋์:
1) Heroku์ ์ง์นจ์ ๋ฐ๋ผ ํ์ดํธ๋ ธ์ด์ฆ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
2) ์๊ตฌ ์ฌํญ์
django-libsass
๋ฅผ ์ถ๊ฐํ์ญ์์ค.3) ์ค์ ํ์ผ์์:
4) ๋ค์์ ํฌํจํ๋
bin/post_compile
ํ์ผ ์ถ๊ฐ(์ด๊ฒ์ post_compile์ ์์ด์ผ ํฉ๋๋ค . ์์ ํ์ผ ์์คํ ๋๋ฌธ์ ๋ฆด๋ฆฌ์ค ์์ ์ด ๋ ์ ์์ต๋๋ค . ์์ถ ์ค์ ์์ฑํ ํ์ผ์ ๋ฆด๋ฆฌ์ค ์์ ์์ ์คํํ๋ฉด ๊ณ ์ ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ post_compile์์ ์คํํ๋ฉด ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค์ด๋ ธ ์ฌ์์์์ ์ด์๋จ์ผ๋ ค๋ฉด.)