hashedassets is een command-line tool dat kopieën van bestanden naar bestandsnamen op basis van hun inhoud & nbsp;. Het schrijft ook een kaart van wat werd omgedoopt tot wat, zodat u uw bestanden te vinden.
Belangrijkste doel hiervan is dat u kunt toevoegen een verre toekomst Expires header uw componenten. Met behulp van hash gebaseerde bestandsnamen is een stuk beter dan het gebruik van uw $ VCS revisienummer, want gebruikers hoeven alleen om bestanden die niet veranderen downloaden.
Het creëren van een aantal bronbestanden
Eerst maken we een bestand dat moet worden hashed:
>>> Systeem ("mkdir input /")
>>> Systeem ("mkdir input / subdir /")
>>> Systeem ("mkdir maps /")
>>> Met open ("input / foo.txt", "w"), zoals file:
... File.write ("foo")
>>> Met open ("input / subdir / bar.txt", "w"), zoals file:
... File.write ("bar")
>>> Systeem ('raak -t200504072213.12 input / foo.txt')
Eenvoudige verbruik
>>> Systeem ("hashedassets maps / map.txt input / *. Txt input / * / *. Txt-uitgang /")
mkdir 'output'
cp 'input / foo.txt' 'uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'uitgang / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Afdrukken geopend ("maps / map.txt"). Read ()
subdir / bar.txt: Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt
foo.txt: C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt
>>> System ("ls uitgang /")
C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt
Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt
>>> System ("ls maps /")
map.txt
Logging level
Als we vertellen het bevel om stil te zijn, is het niet af wat het doet:
>>> Systeem ("hashedassets -q maps / map2.txt input / *. Txt input / * / *. Txt-uitgang /")
Als we vertellen het commando om meer breedsprakig zijn, registreert meer informatie:
>>> Systeem ("hashedassets -vvv maps / map3.txt input / *. Txt input / * / *. Txt-uitgang /")
Debug ingesteld op 10
cp 'input / foo.txt' 'uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'uitgang / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
Wijziging tijd is ook bewaard gebleven:
>>> Old_stat = os.stat ("input / foo.txt")
>>> New_stat = os.stat ("uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt")
>>> [(Getattr (old_stat, prop) == getattr (new_stat, prop))
... Voor de prop in ('st_mtime', 'st_atime', 'st_ino',)]
[True, True, False]
We kunnen dit gemakkelijk doen met meerdere formaten:
JavaScript
>>> Systeem ("hashedassets -n my_callback maps / map.js input / *. Txt input / * / *. Txt-uitgang /")
cp 'input / foo.txt' 'uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'uitgang / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Print geopend ("maps / map.js"). Read ()
var my_callback = {
& Nbsp; "foo.txt": "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt",
& Nbsp; "subdir / bar.txt": "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt"
};
JSON
>>> Systeem ("hashedassets -n my_callback maps / map.json input / *. Txt input / * / *. Txt-uitgang /")
cp 'input / foo.txt' 'uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'uitgang / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Afdrukken geopend ("maps / map.json"). Read ()
{
& Nbsp; "foo.txt": "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt",
& Nbsp; "subdir / bar.txt": "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt"
}
JSONP
>>> Systeem ("hashedassets -n my_callback maps / map.jsonp input / *. Txt input / * / *. Txt-uitgang /")
cp 'input / foo.txt' 'uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'uitgang / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Afdrukken geopend ("maps / map.jsonp"). Read ()
my_callback ({
& Nbsp; "foo.txt": "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt",
& Nbsp; "subdir / bar.txt": "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt"
});
Sass
Sass is een meta-taal op de top van CSS.
>>> Systeem ("hashedassets -n my_callback maps / map.scss input / *. Txt input / * / *. Txt-uitgang /")
cp 'input / foo.txt' 'uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'uitgang / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Afdrukken geopend ("maps / map.scss"). Read ()
mixin my_callback ($ richtlijn, $ path) {
& Nbsp;If $ pad == "subdir / bar.txt" {# {$ richtlijn}: url ("Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt"); }
& Nbsp;else als $ pad == "foo.txt" {# {$ richtlijn}: url ("C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt"); }
& Nbsp;else {
& Nbsp;warn "Heeft u niet gevonden" # $ {pad} "in de lijst van activa";
& Nbsp; # {$ richtlijn}: url ($ path);
& Nbsp;}
}
PHP
>>> Systeem ("hashedassets -n my_callback maps / map.php input / *. Txt input / * / *. Txt-uitgang /")
cp 'input / foo.txt' 'uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'uitgang / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Afdrukken geopend ("maps / map.php"). Read ()
$ My_callback = array (
& Nbsp; "subdir / bar.txt" => "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt",
& Nbsp; "foo.txt" => "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt",
)
Sed
We kunnen ook het genereren van een sed script dat de vervangingen voor ons doet:
>>> Systeem ("hashedassets -n my_callback maps / map.sed input / *. Txt input / * / *. Txt-uitgang /")
cp 'input / foo.txt' 'uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'uitgang / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> Print geopend ("maps / map.sed"). Read ()
s / subdir / bar .txt / Ys23Ag_5IOWqZCw9QGaVDdHwH00 .txt / g
s / foo .txt / C-7Hteo_D9vJXQ3UfzxbwnXaijM .txt / g
We moeten ook in staat zijn om dit direct te gebruiken met sed
>>> Met open ("replaceme.html", "w"), zoals file:
... File.write (' bar ')
Het script wordt vervolgens toegepast als volgt:
>>> Systeem ("sed -f maps / map.sed replaceme.html")
bar
Echter, '.' wordt niet behandeld als wildcard, zodat de volgende werkt niet
>>> Met open ("replaceme2.html", "w"), zoals file:
... File.write (' bar ')
>>> Systeem ("sed -f maps / map.sed replaceme2.html")
bar
Met vermelding van de soort met -t
Het type van de kaart wordt geraden uit de bestandsnaam, maar je kunt het opgeven als goed:
>>> Systeem ("hashedassets -t js cantguessmaptype input / *. Txt input / * / *. Txt-uitgang /")
cp 'input / foo.txt' 'uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / subdir / bar.txt' 'uitgang / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
Met vermelding van de lengte van de bestandsnaam met -l
>>> Systeem ("hashedassets -l 10 kaarten / shortmap.json input / *. Txt input / * / *. Txt-uitgang /")
cp 'input / foo.txt' 'uitgang / C-7Hteo_D9.txt'
cp 'input / subdir / bar.txt' 'uitgang / Ys23Ag_5IO.txt'
>>> Systeem ("rm uitgang / C-7Hteo_D9.txt uitgang / Ys23Ag_5IO.txt")
Onder vermelding van de digest met -d
>>> Systeem ("hashedassets -d md5 maps / shortmap.json input / *. Txt input / * / *. Txt-uitgang /")
cp 'input / foo.txt' 'uitgang / rL0Y20zC-Fzt72VPzMSk2A.txt'
cp 'input / subdir / bar.txt' 'uitgang / N7UdGUp1E-RbVvZSTy1R8g.txt'
>>> Systeem ("rm uitgang / rL0Y20zC-Fzt72VPzMSk2A.txt uitgang / N7UdGUp1E-RbVvZSTy1R8g.txt")
Re-gebruik van een kaart
Het programma leest in kaarten is gemaakt in een eerdere run om alleen bestanden die niet zijn veranderd sinds kopiëren. Dus, de volgende opdrachten geen bestanden te kopiëren:
>>> Systeem ("hashedassets maps / map.scss input / *. Txt input / * / *. Txt-uitgang /")
>>> Systeem ("hashedassets maps / map.php input / *. Txt input / * / *. Txt-uitgang /")
>>> Systeem ("hashedassets maps / map.js input / *. Txt input / * / *. Txt-uitgang /")
>>> Systeem ("hashedassets maps / map.json input / *. Txt input / * / *. Txt-uitgang /")
>>> Systeem ("hashedassets maps / map.sed input / *. Txt input / * / *. Txt-uitgang /")
>>> Systeem ("hashedassets maps / map.jsonp input / *. Txt input / * / *. Txt-uitgang /")
>>> Systeem ("hashedassets maps / map.txt input / *. Txt input / * / *. Txt-uitgang /")
Als we een van de input-bestanden in tussen te raken, zal het bestand worden gelezen, maar niet gekopieerd, omdat de hashsum is hetzelfde:
>>> Systeem ('raak -t200504072214.12 input / foo.txt')
>>> Systeem ("hashedassets maps / map.json input / *. Txt input / * / *. Txt-uitgang /")
Als we de inhoud van het bestand te veranderen, zal het een nieuwe naam krijgen:
>>> Met open ("input / foo.txt", "w"), zoals file:
... File.write ("foofoo")
>>> Systeem ("hashedassets maps / map.json input / *. Txt input / * / *. Txt-uitgang /")
rm 'uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
cp 'input / foo.txt' 'uitgang / QIDaFD7KLKQh0l5O6b8exdew3b0.txt'
Als je dan een lijst van de bestanden in de map, er rekening mee dat het oude bestand '' uitgang / C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt '' is gegaan:
>>> System ("ls uitgang /")
QIDaFD7KLKQh0l5O6b8exdew3b0.txt
Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt
Als we één van de aangemaakte bestanden te verwijderen, het wordt herschapen:
>>> Systeem ("rm uitgang / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt")
>>> Systeem ("hashedassets maps / map.json input / *. Txt input / * / *. Txt-uitgang /")
cp 'input / subdir / bar.txt' 'uitgang / Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> System ("ls uitgang /")
QIDaFD7KLKQh0l5O6b8exdew3b0.txt
Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt
Als een bestand dat op het punt te verwijderen omdat de oorspronkelijke inhoud veranderd, is het niet ontspannen:
>>> Systeem ("rm uitgang / QIDaFD7KLKQh0l5O6b8exdew3b0.txt")
>>> Met open ("input / foo.txt", "w"), zoals file:
... File.write ("foofoofoo")
>>> Systeem ("hashedassets maps / map.json input / *. Txt input / * / *. Txt-uitgang /")
cp 'input / foo.txt' 'uitgang / NdbmnXyjdY2paFzlDw9aJzCKH9w.txt'
Foutafhandeling
Echter, als we lopen dit zonder argumenten, het mislukt:
>>> Systeem ("hashedassets", externe = True)
Gebruik: hashedassets [opties] Mapfile SOURCE [...] DEST
hashedassets: fout: U moet ten minste vermeld Mapfile BRON en DEST
Eisen
- Python
Reacties niet gevonden