跳转到主要内容

根据内容将文件复制到文件名

项目描述

一个命令行工具,根据文件内容将文件复制到文件名。它还记录了重命名映射,以便您找到文件。

此工具的主要目的是您可以为您的组件添加一个远期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 (19.8 kB 查看哈希值)

上传时间

支持