根据内容将文件复制到文件名
项目描述
一个命令行工具,根据文件内容将文件复制到文件名。它还记录了重命名映射,以便您找到文件。
此工具的主要目的是您可以为您的组件添加一个远期Expires头。使用基于哈希的文件名比使用您的$VCS版本号要好得多,因为用户只需要下载未更改的文件。
创建一些源文件
对于此演示,我们将创建一些目录,一个用于存储映射,一个用于存储输入文件
>>> system("mkdir maps/") >>> system("mkdir -p input/subdir/2nd/")
我们还创建了位于子目录和子子目录中的文件
>>> write("input/foo.txt", "foo") >>> write("input/subdir/bar.txt", "bar") >>> write("input/subdir/2nd/baz.txt", "foofoofoo")
简单用法
>>> system("hashedassets -v maps/map.txt input/*.txt input/*/*.txt output/") mkdir 'output' cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> system("ls maps/") map.txt
>>> print(open("maps/map.txt").read()) foo.txt: C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt subdir/bar.txt: Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt <BLANKLINE>
>>> system("ls output/") C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt
修改时间也得到保留
>>> old_stat = os.stat("input/foo.txt") >>> new_stat = os.stat("output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt") >>> [(getattr(old_stat, prop) == getattr(new_stat, prop)) ... for prop in ('st_mtime', 'st_atime', 'st_ino',)] [True, True, False]
如果您指定目录作为源,则将处理所有文件和子目录
>>> system("hashedassets -v maps/dirmap.txt input/ output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt' cp 'input/subdir/2nd/baz.txt' 'output/NdbmnXyjdY2paFzlDw9aJzCKH9w.txt'
>>> system("rm output/NdbmnXyjdY2paFzlDw9aJzCKH9w.txt")
输出格式
我们可以轻松地以多种格式完成此操作
Sed
此代码生成一个sed脚本,用于为我们进行替换
>>> system("hashedassets -v -n my_callback maps/map.sed input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> print(open("maps/map.sed").read()) s/foo\.txt/C-7Hteo_D9vJXQ3UfzxbwnXaijM\.txt/g s/subdir\/bar\.txt/Ys23Ag_5IOWqZCw9QGaVDdHwH00\.txt/g <BLANKLINE>
我们应能在该文件上使用sed
>>> write("replaceme.html", "<a href=foo.txt>bar</a>")
脚本应用方式如下
>>> system("sed -f maps/map.sed replaceme.html") <a href=C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt>bar</a>
注意,'.' 不会被当作通配符处理,因此以下操作无法正常工作
>>> write("replaceme2.html", "<a href=fooAtxt>bar</a>") >>> system("sed -f maps/map.sed replaceme2.html") <a href=fooAtxt>bar</a>
JavaScript
>>> system("hashedassets -v -n my_callback maps/map.js input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> print(open("maps/map.js").read()) var my_callback = { "foo.txt": "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt", "subdir/bar.txt": "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt" };
JSON
>>> system("hashedassets -v -n my_callback maps/map.json input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> print(open("maps/map.json").read()) { "foo.txt": "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt", "subdir/bar.txt": "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt" }
JSONP
>>> system("hashedassets -v -n my_callback maps/map.jsonp input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> print(open("maps/map.jsonp").read()) my_callback({ "foo.txt": "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt", "subdir/bar.txt": "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt" });
SCSS
Sass(“语法优秀的样式表”)是CSS之上的元语言。
>>> system("hashedassets -v -n my_callback maps/map.scss input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> print(open("maps/map.scss").read()) @mixin my_callback($directive, $path) { @if $path == "foo.txt" { #{$directive}: url("C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt"); } @else if $path == "subdir/bar.txt" { #{$directive}: url("Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt"); } @else { @warn "Did not find "#{$path}" in list of assets"; #{$directive}: url($path); } }
PHP
>>> system("hashedassets -v -n my_callback maps/map.php input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> print(open("maps/map.php").read()) $my_callback = array( "foo.txt" => "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt", "subdir/bar.txt" => "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt", )
选项
使用-t指定类型
映射的类型是从文件名中猜测的,但您也可以指定它
>>> system("hashedassets -v -t js cantguessmaptype input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
使用-l指定文件名长度
>>> system("hashedassets -v -l 10 maps/shortmap.json input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/C-7Hteo_D9.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IO.txt'
>>> system("rm output/C-7Hteo_D9.txt output/Ys23Ag_5IO.txt")
使用-d指定摘要
hashedassets默认使用sha1对输入文件进行哈希处理。您可以使用命令行参数 -d 进行更改,例如,指定 -d md5 以使用md5摘要方法。
>>> system("hashedassets -v -d md5 maps/md5map.json input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/rL0Y20zC-Fzt72VPzMSk2A.txt' cp 'input/subdir/bar.txt' 'output/N7UdGUp1E-RbVvZSTy1R8g.txt'
>>> system("rm output/rL0Y20zC-Fzt72VPzMSk2A.txt output/N7UdGUp1E-RbVvZSTy1R8g.txt")
使用–keep-dirs保留目录结构
默认情况下,hashedassets将所有输出文件复制到输出目录的根目录。您可以使用“–keep-dirs”选项关闭此功能
>>> system("hashedassets -v --keep-dirs maps/preserve.json input/*.txt input/*/*.txt input/*/*/*.txt output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' mkdir -p output/subdir cp 'input/subdir/bar.txt' 'output/subdir/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt' mkdir -p output/subdir/2nd cp 'input/subdir/2nd/baz.txt' 'output/subdir/2nd/NdbmnXyjdY2paFzlDw9aJzCKH9w.txt'
>>> system("rm -r output/subdir/")
使用–map-only不移动任何内容
如果您指定“–map-only”,程序将创建映射,但不会移动任何文件。如果您想在URL重写过程中丢弃的路径中使用哈希名称作为路径的一部分(例如“http://static.example.com/aYs23A/subdir/bar.txt”),这很有用。
>>> system("hashedassets -v --map-only maps/maponly.txt input/*.txt") >>> print(open('maps/maponly.txt').read()) foo.txt: C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt <BLANKLINE>
使用–identity不映射任何内容
如果您指定“–identity”,程序将创建一个映射,将每个文件映射到自身,类似于恒等函数的定义。如果您想暂时禁用hashedassets,但又不想大幅修改构建脚本,可以使用此功能。
>>> system("hashedassets -v --identity maps/identitymap.json input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/foo.txt' mkdir -p output/subdir cp 'input/subdir/bar.txt' 'output/subdir/bar.txt'
>>> print(open('maps/identitymap.json').read()) { "foo.txt": "foo.txt", "subdir/bar.txt": "subdir/bar.txt" }
如果您关闭 –identity,所有恒等文件将被删除
>>> system("hashedassets -v maps/identitymap.json input/*.txt input/*/*.txt output/") rm 'output/foo.txt' cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' rm 'output/subdir/bar.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> print(open('maps/identitymap.json').read()) { "foo.txt": "C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt", "subdir/bar.txt": "Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt" }
>>> system("rm -r output/subdir/")
使用–strip-extensions去除文件扩展名
如果您想去除哈希文件的结果扩展名,此选项适用于您!这对于与“–map-only”选项结合使用特别有用,其中哈希名称成为URL路径的一部分。
>>> system("hashedassets -v --strip-extensions maps/noextensions.json input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00'
>>> print(open('maps/noextensions.json').read()) { "foo.txt": "C-7Hteo_D9vJXQ3UfzxbwnXaijM", "subdir/bar.txt": "Ys23Ag_5IOWqZCw9QGaVDdHwH00" }
>>> system("rm -r output/C-7Hteo_D9vJXQ3UfzxbwnXaijM output/Ys23Ag_5IOWqZCw9QGaVDdHwH00")
使用-v启用详细模式
通常,如果一切正常,程序不会打印任何内容
>>> system("hashedassets maps/map2.txt input/*.txt input/*/*.txt output/")
您可以使用 -v(详细信息)选项告诉程序记录更多详细信息(可多次使用),以查看内部正在发生什么
>>> system("hashedassets -v maps/map3.txt input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
使用–exclude排除文件
您可以使用 --exclude 选项排除目录和文件进行哈希处理,既可以使用模式,也可以使用目录
>>> system("hashedassets -v maps/xmap.txt --exclude input/*/2nd input/ output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> system("hashedassets -v maps/xmap2.txt --exclude input/subdir/ input/ output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt'
>>> system("hashedassets -v maps/xmap3.txt --exclude input/subdir/2nd/baz.txt input/ output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
使用–reference使用相对路径
如果您需要所有路径相对于特定文件或目录,请使用 --reference
>>> system("hashedassets -v --keep-dirs --reference=output/subdir/style.css maps/refmap.txt input/ output/") cp 'input/foo.txt' 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' mkdir -p output/subdir cp 'input/subdir/bar.txt' 'output/subdir/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt' mkdir -p output/subdir/2nd cp 'input/subdir/2nd/baz.txt' 'output/subdir/2nd/NdbmnXyjdY2paFzlDw9aJzCKH9w.txt'
>>> print(open('maps/refmap.txt').read()) ../foo.txt: ../C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt bar.txt: Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt 2nd/baz.txt: 2nd/NdbmnXyjdY2paFzlDw9aJzCKH9w.txt
如果我们再次执行此操作,则没有工作要做
>>> system("hashedassets -v --keep-dirs --reference=output/subdir/ maps/refmap.txt input/ output/") >>> system("rm -r output/subdir/")
高级用法
将映射写入stdout
>>> system("hashedassets --map-type=txt - input/*.txt input/*/*.txt output/") foo.txt: C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt subdir/bar.txt: Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt <BLANKLINE>
重用映射
程序读取先前运行中创建的映射,以仅复制自上次运行以来未更改的文件。因此,以下命令不会复制任何文件
>>> system("hashedassets -v maps/map.scss input/*.txt input/*/*.txt output/") >>> system("hashedassets -v maps/map.php input/*.txt input/*/*.txt output/") >>> system("hashedassets -v maps/map.js input/*.txt input/*/*.txt output/") >>> system("hashedassets -v maps/map.json input/*.txt input/*/*.txt output/") >>> system("hashedassets -v maps/map.sed input/*.txt input/*/*.txt output/") >>> system("hashedassets -v maps/map.jsonp input/*.txt input/*/*.txt output/") >>> system("hashedassets -v maps/map.txt input/*.txt input/*/*.txt output/")
如果在之间触摸一个输入文件,文件将被读取但不会复制,因为哈希总和相同
>>> system('touch -t200504072214.12 input/foo.txt') >>> system("hashedassets -v maps/map.json input/*.txt input/*/*.txt output/")
如果更改文件内容,它将获得新名称
>>> write("input/foo.txt", "foofoo")
然后再次尝试
>>> system("hashedassets -v maps/map.json input/*.txt input/*/*.txt output/") rm 'output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt' cp 'input/foo.txt' 'output/QIDaFD7KLKQh0l5O6b8exdew3b0.txt'
如果您然后列出目录中的文件,请注意,旧文件“output/C-7Hteo_D9vJXQ3UfzxbwnXaijM.txt”已消失
>>> system("ls output/") QIDaFD7KLKQh0l5O6b8exdew3b0.txt Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt
如果我们删除创建的文件之一,它将被重新创建
>>> system("rm output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt") >>> system("hashedassets -v maps/map.json input/*.txt input/*/*.txt output/") cp 'input/subdir/bar.txt' 'output/Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt'
>>> system("ls output/") QIDaFD7KLKQh0l5O6b8exdew3b0.txt Ys23Ag_5IOWqZCw9QGaVDdHwH00.txt
如果即将删除的文件内容已更改,则不会重新创建该文件
>>> system("rm output/QIDaFD7KLKQh0l5O6b8exdew3b0.txt") >>> write("input/foo.txt", "foofoofoo") >>> system("hashedassets -v maps/map.json input/*.txt input/*/*.txt output/") cp 'input/foo.txt' 'output/NdbmnXyjdY2paFzlDw9aJzCKH9w.txt'
使用相同的目录作为源和目标
这同样有效
>>> system("hashedassets -v maps/samedir.json input/*.txt input/") cp 'input/foo.txt' 'input/NdbmnXyjdY2paFzlDw9aJzCKH9w.txt'
即使在命令第二次调用后
>>> system("hashedassets -v maps/samedir.json input/*.txt input/")
请注意,映射文件不包含自引用
>>> print(open("maps/samedir.json").read()) { "foo.txt": "NdbmnXyjdY2paFzlDw9aJzCKH9w.txt" }
>>> write("input/foo.txt", "barbarbar") >>> system("hashedassets -v maps/samedir.json input/*.txt input/") rm 'input/NdbmnXyjdY2paFzlDw9aJzCKH9w.txt' cp 'input/foo.txt' 'input/sWL19addVG2KRYJ02EDKXF4Oh8s.txt'
项目详情
hashedassets-0.3.2.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9acf37f13c6fb7a380927db74c80722709a2ea915af3728c56d82845ce7dcfd5 |
|
MD5 | cd32122a417f598e33fa421dd56b9c6c |
|
BLAKE2b-256 | 53631876de859777b7fc0b983b96129e37cc8e0065df1a62fb0fde0d03788683 |