Grunt-newer配合Grunt-uglify和Bower使用

5
我有一个使用Grunt和Bower的项目。 Grunt-uglify将从Bower目录中的文件合并/缩小到deploy/scripts.js文件夹中。我使用Grunt-newer,因此仅当添加或更改新文件时才会更新deploy/scripts.js文件。一切都很顺利...除了一个问题...

当我使用Bower添加新库时,文件日期反映了文件上传到Bower库(或托管方)的日期,而不是在我的计算机上创建的日期。因此,Grunt-newer认为新的Bower库比deploy/scripts.js文件旧,因此不会更新该文件。

一个麻烦的解决方法是打开新库.js文件并重新保存它。这会修改文件日期,从而grunt-newer将创建deploy/script.js文件。然而,使用如此笨拙的解决方案使得Bower的用处变得无足轻重。


在这里使用grunt-newer是答案吗?或者使用grunt watch。 - R.A. Lucas
请重新阅读上面的帖子。Grunt-newer 正确地完成了它的任务;Bower 只是加载具有旧创建/修改日期的文件。我不明白 Grunt-watch 与此问题有何关联。 - Jason
1个回答

2
您可以使用Bower hooks来操纵文件的修改时间。这有点像一个技巧,但可以实现您想要的效果。
您需要注册一个postinstall钩子,并将更新的组件列表作为参数传递。当调用脚本时,%将被替换为正在安装或卸载的一组以空格分隔的组件。
这些钩子应该在.bowerrc文件中进行注册:
{
    "scripts": {
        "postinstall": "hook.sh %"
    }
}

接下来,您将需要编写一个脚本,用于遍历组件并更改文件的修改时间。
例如,一个 shell 脚本:

#!/bin/bash

for var in "$@"
do
    find "./bower_components/$var" -exec touch {} \;
done

这是另一个用于相同目的的Node.js脚本示例:
var fs = require('fs');
var path = require('path')

var components = process.argv.slice(2)
components.forEach(function (comp) {
    var comp_path = path.join(process.cwd(),"bower_components",comp);
    var files = fs.readdirSync(comp_path);
    files.forEach(function(file) {
        fs.utimesSync(path.join(comp_path, file), new Date(), new Date());
    });
});

有趣的解决方案;正如你所说,它绝对是一种“hack”。我看到了两个潜在问题。1)它依赖于一个shell脚本。如果我错了,请纠正我,但这对于Windows用户来说不是一个好的解决方案,半失去了Bower/NodeJS/Grunt的目的。2)每当一个Bower脚本被更新时,所有脚本修改日期都会被更新。这将迫使Grunt-newer更新所有Bower组件,即使只有一个发生了变化。 - Jason
@Jason(1)您可以使用另一种脚本语言,例如Javascript(您应该安装nodejs) (2)Bower仅传递已安装的组件,因此这不应该成为问题。 - Dror Bereznitsky
@drob 我尝试了一下node.js的例子。请原谅我在node.js方面缺乏经验。我添加了带有上面JavaScript对象的.bowerrc文件。我将其指向script.js。然而,即使脚本为空,我仍然会收到一个相当严重的错误。http://pastebin.com/1JgfKNJQ - Jason
@Jason,你应该像这样注册钩子:"postinstall": "node script.js %"。 - Dror Bereznitsky
很好。脚本运行没有错误,但修改日期没有改变。 - Jason
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接