hashedassets é uma ferramenta de linha de comando que copia arquivos para nomes de arquivos com base em seu conteúdo. & Nbsp; Ele também escreve um mapa do que foi renomeado para que, assim que você pode encontrar seus arquivos.
O objectivo principal desta é que você pode adicionar um futuro distante Expira cabeçalho para os seus componentes. Usando nomes de arquivo de hash com base é muito melhor do que usar o número de revisão $ VCS, pois os usuários só precisa baixar arquivos que não mudaram.
Criação de alguns arquivos de origem
Primeiro, criamos um arquivo para ser hash:
>>> Sistema ("input mkdir /")
>>> Sistema ("input mkdir / subdir /")
>>> Sistema ("mapas mkdir /")
>>> Com open ("input / foo.txt", "w") como arquivo:
... File.write ("foo")
>>> Com open ("input / subdir / bar.txt", "w") como arquivo:
... File.write ("bar")
>>> Sistema ('toque -t200504072213.12 entrada / foo.txt')
uso simples
>>> Sistema ("mapas hashedassets / input map.txt / entrada txt *. / * Saída txt / *. /")
mkdir 'output'
'input / foo.txt' cp 'output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'output / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Print open ("mapas / map.txt"). Read ()
subdir / bar.txt: Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt
foo.txt: C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt
>>> Sistema ("saída de ls /")
C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt
Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt
>>> Sistema ("mapas ls /")
map.txt
Nível de registo
Se contarmos o comando para ficar quieto, ele não imprimir o que está fazendo:
>>> Sistema ("hashedassets -q entrada mapas / map2.txt / entrada txt *. / * / Saída txt *. /")
Se contarmos o comando a ser mais detalhado, ele registra mais informações:
>>> Sistema ("hashedassets -vvv entrada mapas / map3.txt / entrada txt *. / * / Saída txt *. /")
Nível de depuração definido como 10
'input / foo.txt' cp 'output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'output / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
Tempo de modificação também é preservado:
>>> Old_stat = os.stat ("input / foo.txt")
>>> New_stat = os.stat ("output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt")
>>> [(Getattr (old_stat, prop) == getattr (new_stat, prop))
... Para prop em ('st_mtime', 'st_atime', 'st_ino',)]
[Verdade, True, False]
Nós podemos fazer isso facilmente com vários formatos:
JavaScript
>>> Sistema ("hashedassets -n mapas my_callback / map.js entrada / *. Txt de entrada / * / * saída txt. /")
'input / foo.txt' cp 'output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'output / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Print open ("mapas / map.js"). Read ()
var my_callback = {
& Nbsp; "foo.txt": "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt",
& Nbsp; "subdir / bar.txt": "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt"
};
JSON
>>> Sistema ("hashedassets -n mapas my_callback entrada map.json / entrada txt / *. / * Saída txt / *. /")
'input / foo.txt' cp 'output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'output / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Print open ("mapas / map.json"). Read ()
{
& Nbsp; "foo.txt": "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt",
& Nbsp; "subdir / bar.txt": "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt"
}
JSONP
>>> Sistema ("hashedassets -n mapas my_callback / input map.jsonp / entrada txt *. / * Saída txt / *. /")
'input / foo.txt' cp 'output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'output / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Print open ("mapas / map.jsonp"). Read ()
my_callback ({
& Nbsp; "foo.txt": "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt",
& Nbsp; "subdir / bar.txt": "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt"
});
Insolência
Sass é uma linguagem de meta no topo da CSS.
>>> Sistema ("hashedassets -n mapas my_callback / map.scss entrada / *. Txt de entrada / * / * saída txt. /")
'input / foo.txt' cp 'output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'output / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Print open ("mapas / map.scss"). Read ()
my_callbackmixin ($ directiva, $ path) {
& Nbsp;if $ caminho == "subdir / bar.txt" {{# $ directiva}: url ("Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt"); }
& Nbsp; seelse $ caminho == "foo.txt" {{# $ directiva}: url ("C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt"); }
& Nbsp;else {
& Nbsp;warn "Não encontrou" # {$ path} "na lista de ativos";
& Nbsp; # {$ directiva}: url ($ caminho);
& Nbsp;}
}
PHP
>>> Sistema ("hashedassets -n mapas my_callback entrada map.php / entrada txt / *. / * Saída txt / *. /")
'input / foo.txt' cp 'output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'output / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Print open ("mapas / map.php"). Read ()
My_callback $ = array (
& Nbsp; "subdir / bar.txt" => "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt",
& Nbsp; "foo.txt" => "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt",
)
Sed
Nós também pode gerar um script sed que faz as substituições para nós:
>>> Sistema ("hashedassets -n mapas my_callback / input map.sed / entrada txt *. / * / Saída txt *. /")
'input / foo.txt' cp 'output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'output / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Print open ("mapas / map.sed"). Read ()
s / subdir / bar .txt / Ys23Ag_5IOWqZCw9QGaVDdHwH00 .txt / g
s / foo .txt / C-7Hteo_D9vJXQ3UfzxbwnXaijM .txt / g
Nós também deve ser capaz de usar este diretamente com sed
>>> Com open ("replaceme.html", "w") como arquivo:
... File.write (' bar ')
O script é então aplicada como este:
>>> Sistema ("sed mapas -f / replaceme.html map.sed")
bar
No entanto, '.' não é tratado como coringa, então o seguinte não funciona
>>> Com open ("replaceme2.html", "w") como arquivo:
... File.write (' bar ')
>>> Sistema ("sed mapas -f / replaceme2.html map.sed")
bar
Especificando o tipo com -t
O tipo do mapa é adivinhado a partir do nome do arquivo, mas você pode especificá-lo bem:
>>> Sistema ("hashedassets -t js cantguessmaptype entrada / *. Txt de entrada / * / *. Txt saída /")
'input / foo.txt' cp 'output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'output / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
Especificando o comprimento do nome do arquivo com a opção -l
>>> Sistema ("hashedassets -l 10 mapas / input shortmap.json / entrada txt *. / * Saída txt / *. /")
'input / foo.txt' cp 'output / C-7Hteo_D9.txt'
cp 'input / subdir / bar.txt' 'output / Ys23Ag_5IO.txt'
>>> Sistema ("output rm / saída C-7Hteo_D9.txt / Ys23Ag_5IO.txt")
Especificando o resumo com -d
>>> Sistema ("hashedassets -d mapas md5 / input shortmap.json / *. Txt de entrada / * / *. Txt saída /")
'input / foo.txt' cp 'output / rL0Y20zC-Fzt72VPzMSk2A.txt'
cp 'input / subdir / bar.txt' 'output / N7UdGUp1E-RbVvZSTy1R8g.txt'
>>> Sistema ("output rm / saída rL0Y20zC-Fzt72VPzMSk2A.txt / N7UdGUp1E-RbVvZSTy1R8g.txt")
Re-usando um mapa
O programa lê-lo em mapas criados em uma corrida antes de copiar apenas arquivos que não foram alterados desde então. Então, os seguintes comandos não copiar todos os arquivos:
>>> Sistema ("mapas hashedassets / map.scss entrada / *. Txt de entrada / * / * saída txt. /")
>>> Sistema ("mapas hashedassets / input map.php / entrada txt *. / * / * Saída txt. /")
>>> Sistema ("mapas hashedassets / map.js entrada / *. Txt de entrada / * / * saída txt. /")
>>> Sistema ("mapas hashedassets / input map.json / entrada txt *. / * / * Saída txt. /")
>>> Sistema ("mapas hashedassets / input map.sed / entrada txt *. / * Saída txt / *. /")
>>> Sistema ("mapas hashedassets / input map.jsonp / entrada txt *. / * / * Saída txt. /")
>>> Sistema ("mapas hashedassets / input map.txt / entrada txt *. / * Saída txt / *. /")
Se tocarmos um dos arquivos de entrada no meio, o arquivo será lido, mas não copiado porque o hashsum é o mesmo:
>>> Sistema ('toque -t200504072214.12 entrada / foo.txt')
>>> Sistema ("mapas hashedassets / input map.json / entrada txt *. / * / * Saída txt. /")
Se mudarmos o conteúdo do arquivo, ele terá um novo nome:
>>> Com open ("input / foo.txt", "w") como arquivo:
... File.write ("foofoo")
>>> Sistema ("mapas hashedassets / input map.json / entrada txt *. / * / * Saída txt. /")
'output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' rm
'input / foo.txt' cp 'output / QIDaFD7KLKQh0l5O6b8exdew3b0.txt'
Se você, em seguida, listar os arquivos no diretório, note que o antigo arquivo '' output / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt '' é ido:
>>> Sistema ("saída de ls /")
QIDaFD7KLKQh0l5O6b8exdew3b0.txt
Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt
Se removermos um dos arquivos criados, ele é recriado:
>>> Sistema ("output rm / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt")
>>> Sistema ("mapas hashedassets / input map.json / entrada txt *. / * / * Saída txt. /")
cp 'input / subdir / bar.txt' 'output / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Sistema ("saída de ls /")
QIDaFD7KLKQh0l5O6b8exdew3b0.txt
Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt
Se um arquivo que está prestes a ser removido porque o conteúdo original alterado, ele não é recriado:
>>> Sistema ("output rm / QIDaFD7KLKQh0l5O6b8exdew3b0.txt")
>>> Com open ("input / foo.txt", "w") como arquivo:
... File.write ("foofoofoo")
>>> Sistema ("mapas hashedassets / input map.json / entrada txt *. / * / * Saída txt. /")
'input / foo.txt' cp 'output / NdbmnXyjdY2paFzlDw9aJzCKH9w.txt'
Tratamento de erros
No entanto, se executar este sem argumentos, ele falhar:
>>> Sistema ("hashedassets", externa = True)
Uso: hashedassets [opções] ARQMAPA SOURCE [...] DEST
hashedassets: Erro: É necessário especificar pelo menos SOURCE ARQMAPA e DEST
Requisitos :
- Python
Comentários não encontrado