CSS minificado deve ser armazenado no Git?

10

Eu uso o Gulp para gerar CSS minificado do meu código SASS para um projeto em que estou trabalhando.

Gostaria de saber se é considerado uma boa prática regenerar esse CSS minificado ao enviar ao vivo o Git ...

ou

Para armazenar os arquivos CSS minificados no Git para que eles sejam automaticamente enviados para produção, sem mais trabalho por parte do servidor?

Eu apreciaria as idéias das pessoas sobre isso. Obrigado!

Connor Gurney
fonte
Existe apenas um local minificado css / js / etc. devem ser armazenados: /dev/null.
R .. GitHub Pare de ajudar o gelo
(Isso ocorre porque o servidor da Web é perfeitamente capaz de usar o transporte compactado com gzip.)
R .. GitHub PARE DE AJUDAR O GELO
Armazenar CSS compactado e descompactado significa que agora você tem duas versões da mesma coisa. Qual é a versão canônica? É fácil visualizar o cenário em que um desenvolvedor atualiza o CSS compactado e outro atualiza o CSS não compactado. Seus dois ativos agora divergiram. Obviamente, o processo deve evitar isso, mas é uma perspectiva realista com, por exemplo, um novo desenvolvedor na equipe.
Qwerky

Respostas:

13

"Depende." Para rastreamento de desenvolvimento normal, não. Para implantações em nuvem e DevOps, no entanto, muitas vezes é conveniente ou até necessário.

Na maioria das vezes, @ptyx está correto . De fato, seu "não" poderia ser declarado de maneira um pouco mais enfática. Algo como "Não. Não! OMG NÃO! "

Por que não armazenar ativos compactados ou minificados no sistema de controle de origem como o Git?

  1. Eles podem ser quase trivialmente regenerados pelo seu processo de criação em tempo real a partir do código-fonte. Armazenar ativos compactados é basicamente armazenar o mesmo conteúdo lógico duas vezes. Ele viola o princípio "não se repita" (também conhecido como DRY ).

  2. Um motivo menos filosófico, mas mais prático, é que os ativos minificados / otimizados têm uma compressibilidade muito baixa quando armazenados no Git. Os sistemas de controle de origem funcionam reconhecendo as alterações ("deltas") entre diferentes versões de cada arquivo armazenado. Para fazer isso, eles "diferenciam" o arquivo mais recente da versão anterior e usam esses deltas para evitar o armazenamento de uma cópia completa de todas as versões do arquivo. Porém, as transformações feitas na etapa minify / optimize frequentemente removem as semelhanças e pontos de referência usados ​​pelos algoritmos diff / delta . O exemplo mais trivial é remover quebras de linha e outros espaços em branco; o ativo resultante geralmente é apenas uma longa fila. Muitas partes do processo de criação da Web - ferramentas como Babel , UglifyJS , Browserify ,Menos e Sass / SCSS - transformam agressivamente ativos. Sua produção é perturbável; pequenas alterações de entrada podem levar a grandes mudanças na saída. Como resultado, o algoritmo diff geralmente acredita que vê quase sempre um arquivo completamente diferente. Seus repositórios crescerão mais rapidamente como resultado. Seus discos podem ser grandes o suficiente e suas redes rápidas o suficiente, o que não é uma grande preocupação, especialmente se houver um valor em armazenar os ativos minimizados / otimizados duas vezes - embora, com base no ponto 1, as cópias extras possam ser 100% inúteis inchar.

Porém, há uma grande exceção: implantações de DevOps / nuvem. Vários fornecedores de nuvem e equipes de DevOps usam o Git e similares, não apenas para rastrear atualizações de desenvolvimento, mas também para implantar ativamente seus aplicativos e ativos em servidores de teste e produção. Nesta função, a capacidade do Git de determinar com eficiência "quais arquivos foram alterados?" é tão importante quanto sua capacidade mais granular de determinar "o que mudou em cada arquivo?" Se o Git tiver que fazer uma cópia quase completa do arquivo para ativos minimizados / otimizados, isso levará um pouco mais do que normalmente, mas não é grande coisa, pois ainda está fazendo um excelente trabalho, ajudando a evitar uma cópia de "todos os arquivos do projeto" em cada ciclo de implantação.

Se você estiver usando o Git como um mecanismo de implantação, o armazenamento de ativos minimizados / otimizados no Git poderá mudar de "não!" desejável. De fato, pode ser necessário, digamos, se você não tiver oportunidades robustas de compilação / pós-processamento nos servidores / serviços nos quais você implementa. (Como segmentar ativos de desenvolvimento e implantação, nesse caso, é uma lata separada de worms. Por enquanto, basta saber que pode ser gerenciado de várias maneiras, inclusive com um único repositório unificado, várias ramificações, sub-repositórios ou mesmo vários repositórios sobrepostos. )

Jonathan Eunice
fonte
1
Obrigado por isso! Muito apreciado. Marquei isso como a resposta, pois parece muito melhor explicado.
Connor Gurney
1
O git não armazena apenas deltas. O SVN usa, mas o git usa um mecanismo muito mais complexo para armazenar arquivos. Algumas pessoas dizem que ele armazena uma cópia completa de cada arquivo, mas, pelo que entendi, isso também está incorreto. Não vou tentar entender o que ele faz, pois não sou totalmente claro.
Jpmc26 31/08/19
Eu acho que você pode alcançar as nuances apenas alterando "e armazenar apenas os novos deltas" em algo semelhante ao ", e usar esses deltas para evitar o armazenamento de uma cópia completa de todas as versões do arquivo". Isso faria o seu ponto de vista, ser factualmente correto e evitar investigar a questão de como isso é feito para qualquer sistema de controle de origem.
Jpmc26 31/08/16
O DevOps poderia apenas usar ganchos git para acionar automaticamente a minificação no servidor implantado, obtendo o melhor dos dois mundos?
Buttle Butkus
@ButtleButkus Depende do servidor implantado. Para depender dos ganchos de postagem, você deve 1 / presumir que os transpilers, minificadores e otimizadores apropriados estejam presentes no destino ou 2 / carregá-los antes de executar os ganchos de postagem. 1 / é arriscado. 2 / impõe um custo / latência de carga em cada implantação. Ele também introduz novos modos de falha possíveis e um requisito para depurar ganchos de postagem em um ambiente remoto, opaco e transitório. Não é ideal. Então ganchos não são uma bala de prata. A pré-conversão / otimização de ativos pode ser deselegante, mas é robusta e pragmática.
Jonathan Eunice
17

Não.

O controle da fonte deve conter apenas a fonte. Se é gerado a partir da fonte, não pertence a ele - e deve ser gerado pelo seu processo de construção.

A razão fundamental pela qual você não deseja controlar os artefatos de construção intermediários de controle de origem é que, se o fizer, fica muito difícil confiar se o que você está executando vem da fonte que você acabou de modificar ou de um produto intermediário que você não conseguiu reconstruir .

ptyx
fonte
3
Pense no código gerado da maneira que você pensa no código executável.
Candied_orange 30/08
3
Este princípio nem sempre é verdadeiro. Se você possui arquivos gerados com ferramentas pesadas que não pode esperar que um usuário possua, pode fazer sentido colocar os arquivos gerados no git. Muitas pessoas até colocam configurescripts de autoconf gerados no git por esse motivo.
R .. GitHub Pare de ajudar o gelo
@R ..: Idealmente, você mantém um repositório de artefatos separado para essas coisas, mas a realidade raramente é ideal.
Kevin
@R você pode comprometer - mas é só isso. E, no caso da minificação de CSS, não acho que as ferramentas se qualifiquem como 'pesadas' ou 'lentas' ou 'inconvenientes'. Além disso, existem mecanismos alternativos de injeção de dependência (maven, ivy ...) que funcionam bem e não exigem que você coloque o código gerado em seu controle de origem.
Ptyx 31/08/16
1
@ButtleButkus Não tenho muita experiência no caso devops. O que eu vi é o git usado como um mecanismo (muito conveniente e flexível) de transporte / liberação / implantação, em vez de puramente como controle de origem. A menos que o git 'source' e o git 'delivery' sejam separados (repositórios separados ou ramificações separadas), isso significa que você deve comprometer um pouco a cadeia de fornecimento de origem -> construção -> entrega - por exemplo, você terminará com a produção com código fonte e ramos extras por aí, e desenvolvimento com produtos binários não utilizados. É um compromisso pragmático, mas prefiro separar preocupações quando posso.
Ptyx #