Django-compressor: Não há como fazer isso funcionar no Heroku

Criado em 6 mar. 2014  ·  24Comentários  ·  Fonte: django-compressor/django-compressor

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).

deployment

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:

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.)

Todos 24 comentários

Não é bug ;)

Mas foram muitas perguntas ;)

  • na maioria dos cenários de carregamento, eu usaria dj-static (como visto nos documentos do heroku ) ou whitenoise para servir arquivos estáticos no heroku.
  • se tudo estiver bem configurado, o heroku executa collectstatic para você quando você envia seu código
  • se você quiser adicionar compactação offline, você pode adicionar um script post_compile (veja aqui ) que executa a compactação para você
  • não comprima offline localmente, deixe o heroku fazer isso por você.
  • para instalar 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.

Esta página foi útil?
0 / 5 - 0 avaliações