Pesquisando na web, não parece uma maneira direta de fazer isso funcionar no heroku.
Achei que colocar tudo no S3 como é o caminho recomendado pelo heroku para arquivos seria o caminho a seguir. Então eu li isso: http://django-compressor.readthedocs.org/en/latest/remote-storages/
o que está tudo bem, mas depois de ter feito isso, não diz qual é o resultado. Eu corro collectstatic, compact, ambos? Faço isso localmente ou deixo o gancho heroku fazer isso por mim? Ou de fato desabilito o heroku collectstatic porque não tenho lessc &co no ambiente heroku de qualquer maneira.
Então, pelo menos, isso seria um bug de documentação para esta página: http://django-compressor.readthedocs.org/en/latest/remote-storages/
Em princípio, isso também deve funcionar no heroku se você gerar tudo offline e verificá-los em seu controle de versão, certo?
Existem esses artigos sobre como configurar o node e menos no ambiente heroku, mas eles parecem um pouco excessivos e de fato não funcionam:
http://marklmiddleton.com/2013/using-less-with-django-on-heroku/
http://www.sore.nu/blog/2012/dec/30/fieldguide-django-bootstrap-less-coffeescript-and-/
Estou perdendo alguma coisa aqui? Depois de passar meio dia nisso ontem, estou desistindo (a alternativa clara é compilar tudo localmente usando as ferramentas de front-end padrão).
Não é bug ;)
Mas foram muitas perguntas ;)
collectstatic
para você quando você envia seu códigopost_compile
(veja aqui ) que executa a compactação para vocêlessc
no heroku é outra tarefa, eu teria que pesquisar no google e tentar também.. Mas seu primeiro link parece promissor (pelo menos o script post_compile ).Na seção vinculada acima em "Usando arquivos estáticos", ainda não tenho ideia de por que você precisa criar sua própria subclasse de armazenamento ou o que precisa fazer depois de fazer isso.
Eu tentei instalar o lessc no heroku, mas se o script post_compile fornecido não funcionar diretamente, isso é extremamente tedioso para depurar e, francamente, não parece uma boa ideia criar um contêiner com tudo e a pia da cozinha.
Impressionado com o quão difícil isso ainda é, mas se alguém me disser o que está acontecendo aqui: http://django-compressor.readthedocs.org/en/latest/remote-storages/
Ficarei feliz em adicionar um patch de documentação.
Eu criei um fork do django-skel que suporta django-compressor, compilação scss, bower e muitas outras coisas (e o tenho rodando no heroku). Alguém está interessado em ver?
Eu acho que as pessoas definitivamente estariam interessadas em ver coisas que funcionam!
@therippa : Eu estaria interessado em ver isso também.
O modo Online do Compressor não funciona no Heroku porque o Whitenoise só verifica a pasta estática quando o aplicativo é carregado (veja meu comentário no problema #680). Para usar o compressor em produção, acho que você precisa usá-lo no modo Offline e executar python manage.py compress
antes que o aplicativo seja carregado usando o gancho de compilação pós-Heroku. O Heroku executará automaticamente a coleta de estática para você, então isso não é um problema. Achei o heroku-django-cookbook útil. Estou usando o TypeScript no meu aplicativo Django/Heroku, então também precisei instalar o node etc. Isso é possível através do gancho post-compile, um pacote pip personalizado ou um pacote de compilação personalizado. Eu acho que o gancho pós-compilação é a maneira mais fácil.
Como eu tive esse problema em combinação com o sekizai, usar a compactação offline não era realmente uma opção. Mas esse problema é realmente facilmente corrigido ao estender o ruído branco, então aqui está minha solução: https://gist.github.com/Chronial/45ce9f33615a3b24c51f
Talvez alguém queira adicionar alguns testes e documentação a isso e enviar um PR adequado para whitenoise? :)
Nota: Se você ainda deseja pré-geração ou heroku, você pode iniciar o servidor e enviar algumas solicitações em seu gancho post_build
.
Os documentos do Whitenoise mencionam o django-compressor em http://whitenoise.evans.io/en/stable/django.html#django -compressor
OK. Isso funcionou para mim brilhantemente!
Dentro do meu diretório local raiz (também conhecido como repo), criei um diretório bin/
e dentro dele um arquivo chamado post_compile
. Dentro do arquivo post_compile
eu copiei e colei esses dados .
Eu fiz git add --all
, git commit -m 'testing post_receive hook in Heroku'
, git push heroku master
.
Após a execução automática do comando collectstatic
pelo Heroku, ele executou python manage.py compress
e criou um diretório que contém todos os meus arquivos compactados em um arquivo!
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).
se você estiver vendo OfflineCompressionErrors, confira também https://github.com/django-compressor/django-compressor/issues/443 onde as pessoas sugerem mais soluções alternativas.
no caso do #831, o que funcionou é fazer a compactação offline localmente e enviar o resultado incluindo o manifest.json para o heroku. não há S3 lá embora.
aqui está outra configuração que funciona para o autor: https://github.com/django-compressor/django-compressor/issues/855#issuecomment -303294202
OK, aqui está algo que está funcionando para mim e sobreviveu ao reinício do dinamômetro. Meus principais objetivos aqui eram 1) não precisar adicionar uma situação de buildpack de ruby/JS apenas para meu pipeline de ativos; 2) não precisar configurar o S3; 3) fazer com que isso aconteça automaticamente como parte da implantação, em vez de exigir etapas locais.
Assim:
1) Configure whitenoise de acordo com as instruções do Heroku.
2) adicione django-libsass
aos seus requisitos.
3) No seu arquivo de configurações:
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) Adicione um arquivo bin/post_compile
contendo
python manage.py compress
python manage.py collectstatic --noinput
(Observe que isso deve estar em post_compile. Não pode ser uma tarefa de lançamento por causa do sistema de arquivos efêmero - os arquivos que você gera durante a compactação não permanecerão se você os executar em uma tarefa de lançamento. Mas executá-los em post_compile parece funcionar, e para sobreviver ao reinício do dinamômetro.)
A solução @thatandromeda funcionou para mim, muito obrigado!
@thatandromeda esta solução pode ser exatamente o que estou procurando (após 12 horas tentando toneladas de coisas). Onde exatamente bin/post_compile vai? como eu faria para adicionar? como eu digo heroku para usá-lo?
@manikos @thatandromeda Devo executar collectstatic
antes ou depois ou antes e depois compress
? Meu comando de gerenciamento de compactação diz que o arquivo não foi encontrado:
ValueError: The file 'css/font-awesome.min.css' could not be found with <whitenoise.storage.CompressedManifestStaticFilesStorage object at 0x7f3e3fc3b828>.
@typistX Você não precisa dizer nada ao heroku, ele detecta automaticamente se você tem um diretório chamado bin
na raiz do seu projeto (repo) e se existe um arquivo chamado post_compile
(sem arquivo extensão) dentro.
@thatandromeda Você acabou de me salvar depois de 3 dias lidando com essa porcaria. 🙏🏼
Desculpe, você está tendo essa dificuldade / feliz por poder ajudar!
@technolingo a compactação precisa ser executada após o collectstatic.
Ambas as soluções, @thatandromeda e @manikos funcionaram para mim, obrigado! 😃
Confirma-se que isso não é um bug, mas apenas uma falta de informações sobre o processo de implantação no Heroku, mencioná-lo em algum lugar na documentação com certeza seria de ajuda.
Ficarei feliz em revisar e mesclar qualquer documentação de melhoria de solicitação de pull. Nenhum dos mantenedores ativos tem uma conta heroku, então cabe aos usuários sugerirem mudanças.
um botão de implantação de 1 clique para heroku seria bem-vindo aqui? ou apenas um documento percorrendo a implantação do heroku?
@ morenoh149 Na minha opinião, o que é mais necessário aqui é a documentação, um "botão de implantação com 1 clique" pode ajudar, mas quando eu estava procurando pelo _o bug_ queria saber exatamente qual era o problema.
Comentários muito úteis
OK, aqui está algo que está funcionando para mim e sobreviveu ao reinício do dinamômetro. Meus principais objetivos aqui eram 1) não precisar adicionar uma situação de buildpack de ruby/JS apenas para meu pipeline de ativos; 2) não precisar configurar o S3; 3) fazer com que isso aconteça automaticamente como parte da implantação, em vez de exigir etapas locais.
Assim:
1) Configure whitenoise de acordo com as instruções do Heroku.
2) adicione
django-libsass
aos seus requisitos.3) No seu arquivo de configurações:
4) Adicione um arquivo
bin/post_compile
contendo(Observe que isso deve estar em post_compile. Não pode ser uma tarefa de lançamento por causa do sistema de arquivos efêmero - os arquivos que você gera durante a compactação não permanecerão se você os executar em uma tarefa de lançamento. Mas executá-los em post_compile parece funcionar, e para sobreviver ao reinício do dinamômetro.)