使用 Grunt 在文件名末尾添加时间戳
Add a Timestamp to the End of Filenames with Grunt
在我的 G运行t 任务中,在我的文件名末尾添加一个唯一的字符串。我试过 g运行t-contrib-copy 和 g运行t-filerev。他们都无法完成我需要他们做的事情...
目前,我的 LESS 文件在 Sublime Text 3 中的 'save' 上自动编译(所以这还没有发生在我的 g运行t 任务中)。然后,我打开我的终端和 运行 'g运行t',它连接(组合)我的 JS 文件。完成后,g运行t 应该重命名 'dist/css/main.css' 和 'dist/js/main .js',文件名末尾带有 "version"。
我试过:
- g运行t-contrib-copy ('clean:expired'在g运行t-contrib-copy'可以重命名文件之前删除连接的JS)
- g运行t-filerev ('This only worked on the CSS files for some reason, and it inserted the version number BEFORE the '.css'。不确定为什么它对 JS 文件不起作用.')
所以,明确地说,我不是在要求 "code review" 我只需要知道如何整合一个 "rename" 流程,这样当任务完成时,我将 'dist/css/main.css12345 & dist/js/main.js12345' 没有 'dist/css/main.css' 或 'dist/js/main.js' 留在各自的目录中。
在此先感谢您的帮助!
更新: 试验之后,我最终使用了 grunt-contrib-rename and it works great! I beleieve the same results can be achieved via grunt-contrib-copy,事实上我知道它也是一样的事物。所以两者都会起作用。至于对正则表达式的支持,不确定两者是否都支持它,所以在选择其中一个插件之前可能还有其他值得研究的东西:)
我不确定是否完全理解您想要的结果,但是如果您在 gruntfile 的开头添加一个 var timestamp = new Date().getTime();
并连接到您的 dest
应该完成这项工作的参数。
dest: 'dist/js/main.min.js' + timestamp
这是你要找的吗?
你的 rename:dist
看起来应该做你想做的,你只需要移动 clean:dist
成为第一个运行的任务(所以它从先前的构建中删除东西而不是当前的建造)。任务的顺序由最后一行的数组定义:
grunt.registerTask('default', ['jshint:dev', 'concat:dist', 'less:dist', 'csslint:dist', 'uglify:dist', 'cssmin:dist', 'clean:dist', 'rename:dist']);
就是说,我不确定您为什么想要这种行为。更常见的做法是将文件的哈希值插入到文件扩展名之前的文件名中。
散列和时间戳之间的区别在于,只要文件内容不变,散列值将始终相同 - 因此,如果您只更改一个文件,则该文件的编译输出将不同,因此浏览器只需要重新下载该文件,同时使用所有其他文件的缓存版本。
将此数字放在文件扩展名之前和文件扩展名之后的区别在于,许多工具(如您的 IDE)的行为会根据扩展名而改变。
对于这个更标准的目标,有很多方法可以实现它,但更常见的方法之一是将 grunt-filerev
与 grunt-usemin
结合使用,这将创建正确命名的文件并更新您的 HTML 个文件引用这些新文件名
在我的 G运行t 任务中,在我的文件名末尾添加一个唯一的字符串。我试过 g运行t-contrib-copy 和 g运行t-filerev。他们都无法完成我需要他们做的事情...
目前,我的 LESS 文件在 Sublime Text 3 中的 'save' 上自动编译(所以这还没有发生在我的 g运行t 任务中)。然后,我打开我的终端和 运行 'g运行t',它连接(组合)我的 JS 文件。完成后,g运行t 应该重命名 'dist/css/main.css' 和 'dist/js/main .js',文件名末尾带有 "version"。
我试过:
- g运行t-contrib-copy ('clean:expired'在g运行t-contrib-copy'可以重命名文件之前删除连接的JS)
- g运行t-filerev ('This only worked on the CSS files for some reason, and it inserted the version number BEFORE the '.css'。不确定为什么它对 JS 文件不起作用.')
所以,明确地说,我不是在要求 "code review" 我只需要知道如何整合一个 "rename" 流程,这样当任务完成时,我将 'dist/css/main.css12345 & dist/js/main.js12345' 没有 'dist/css/main.css' 或 'dist/js/main.js' 留在各自的目录中。
在此先感谢您的帮助!
更新: 试验之后,我最终使用了 grunt-contrib-rename and it works great! I beleieve the same results can be achieved via grunt-contrib-copy,事实上我知道它也是一样的事物。所以两者都会起作用。至于对正则表达式的支持,不确定两者是否都支持它,所以在选择其中一个插件之前可能还有其他值得研究的东西:)
我不确定是否完全理解您想要的结果,但是如果您在 gruntfile 的开头添加一个 var timestamp = new Date().getTime();
并连接到您的 dest
应该完成这项工作的参数。
dest: 'dist/js/main.min.js' + timestamp
这是你要找的吗?
你的 rename:dist
看起来应该做你想做的,你只需要移动 clean:dist
成为第一个运行的任务(所以它从先前的构建中删除东西而不是当前的建造)。任务的顺序由最后一行的数组定义:
grunt.registerTask('default', ['jshint:dev', 'concat:dist', 'less:dist', 'csslint:dist', 'uglify:dist', 'cssmin:dist', 'clean:dist', 'rename:dist']);
就是说,我不确定您为什么想要这种行为。更常见的做法是将文件的哈希值插入到文件扩展名之前的文件名中。
散列和时间戳之间的区别在于,只要文件内容不变,散列值将始终相同 - 因此,如果您只更改一个文件,则该文件的编译输出将不同,因此浏览器只需要重新下载该文件,同时使用所有其他文件的缓存版本。
将此数字放在文件扩展名之前和文件扩展名之后的区别在于,许多工具(如您的 IDE)的行为会根据扩展名而改变。
对于这个更标准的目标,有很多方法可以实现它,但更常见的方法之一是将 grunt-filerev
与 grunt-usemin
结合使用,这将创建正确命名的文件并更新您的 HTML 个文件引用这些新文件名