Grunt-newer与Grunt-uglify和Bower合作

Jas*_*son 5 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的实用性似乎没有用这种尴尬的解决方案.

Dro*_*sky 2

您可以使用Bower hooks来操纵文件修改时间。这是一种黑客攻击,但可以实现您想要的目标。
您将需要注册一个postinstall挂钩并将更新的组件列表作为参数传递。调用脚本时,% 将替换为正在安装或卸载的组件的空格分隔列表。
挂钩应在.bowerrc文件中注册:

{
    "scripts": {
        "postinstall": "hook.sh %"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您将需要一个脚本来迭代组件并更改文件的修改时间。
例如 shell 脚本:

#!/bin/bash

for var in "$@"
do
    find "./bower_components/$var" -exec touch {} \;
done
Run Code Online (Sandbox Code Playgroud)

以下是用于相同目的的 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());
    });
});
Run Code Online (Sandbox Code Playgroud)