Grunt-newer与Grunt-uglify和Bower合作

时间:2014-09-09 22:14:17

标签: gruntjs bower grunt-contrib-uglify

我有一个使用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的用处似乎没有用这种尴尬的解决方案。

1 个答案:

答案 0 :(得分: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());
    });
});