Node.js Gulp:如何更改文件的修改时间

Node.js Gulp:如何更改文件的修改时间,node.js,gulp,Node.js,Gulp,我在下面有一个gulp任务,每次运行这个任务时(在browsersync之前),我都想更改一个文件的最后修改时间(该文件中没有任何更改,我只需要更改最后修改的时间-替代shell“touch”命令)。谁能告诉我最简单的方法是什么?谢谢 gulp.task('sass', function() { return sass(pkg.sass.dir, {sourcemap: true, precision: 10}) .on('error', function (err)

我在下面有一个gulp任务,每次运行这个任务时(在browsersync之前),我都想更改一个文件的最后修改时间(该文件中没有任何更改,我只需要更改最后修改的时间-替代shell“touch”命令)。谁能告诉我最简单的方法是什么?谢谢

gulp.task('sass', function() {

    return sass(pkg.sass.dir, {sourcemap: true, precision: 10}) 
        .on('error', function (err) { 
            onError(err);
        })
        .pipe(autoprefixer({
            browsers: ['last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'],
            cascade: true
        }))
        .pipe(gulp.dest(pkg.css.dir))
        .pipe(browsersync.reload({stream:true}));
});

使用core
fs
模块的功能,这是与Unix
touch
命令类似的节点。你传递路径,如果你传递一个
newdate()
作为
mtime
参数,那就应该可以了。

你可以简单地使用

更改使用gulp复制的文件的文件访问和修改时间

npm install --save-dev gulp-touch-cmd

var gulp = require('gulp');
var touch = require('gulp-touch-cmd');

gulp.task('default', function() {
  gulp
    .src('./src/**/*')
    .pipe(gulp.dest('./dest'))
    .pipe(touch());
});

gulptouch cmd
gulptouch
在gulp4中似乎不起作用,所以我编写了这个小管道函数。(
npm直接添加2

const through2=require('through2');
//范例
.pipe(通过h2.obj)(函数(文件、enc、cb){
让日期=新日期();
file.stat.atime=日期;
file.stat.mtime=日期;
cb(空,文件);
}) )
.pipe(吞咽目标('.'))
Edit:一个更好的、可重用的示例

。。。
const through2=需要('through2');
const touch=()=>through2.obj(函数(文件、enc、cb){
if(file.stat){
file.stat.atime=file.stat.mtime=file.stat.ctime=new Date();
}
cb(空,文件);
});
...
gulp.task('sass',function(){
返回gulp.src(pkg.sass.dir)
.pipe(sourcemaps.init())
.pipe(sass())
.pipe(postsss())
.pipe(sourcemaps.write())
.pipe(touch())
.管道(大口目的地(包装css.dir));
});
Gulp插件修复了的Gulp 4兼容性问题

例如:

const {src, dest} = require('gulp');
const touch = require('gulp-touch-fd');

function copyAndTouch() {
  return src('./src/**/*')
    .pipe(dest('./dest'))
    .pipe(touch());
};

exports.copyAndTouch = copyAndTouch

如果我们只需要将日期设置为“现在”,则可以工作,但如果我们需要将修改时间设置为更具体的时间(如
touch-t
touch-r
),则无法工作

为此,我们可以使用:

const gulp=require('gulp');
const-touch=需要('gulp-touch-custom');
const-through=require('through2');
常数乙烯基=要求(“乙烯基”);
函数exampleproc(){
通过.obj返回(函数(文件、编码、cb){
//示例:推送带有时间戳的新输出文件以匹配其输入
这个。推(新乙烯基)({
路径:`${file.relative}.out`,
目录:file.contents.reverse(),
touch:file.stat.mtime,//指定要在此处使用的可选日期(从输入文件复制)
}));
//示例:设置明确的日期
file.touch=新日期('2000-01-01');
cb(空,文件);
});
}
吞咽任务('示例',函数(){
返回一口src('./***/.in')
.pipe(例如proc())
.管道(大口目的地('./目的地'))
.pipe(touch());
});

fs.writeFileSync('sporks','','utf8','a')

关于如何在
管道中实现这一点的任何提示()
?@WraithKenny我建议在Gulptouch cmd github存储库上打开一个问题,请求更新以支持gulp v4。看起来该项目是两年前完成的。这里的优点是它可以让gulp自己在写入文件时设置正确的时间,而不是事后手动触摸。该解决方案还解决了切换到gulp 4.x后我在PHPStorm方面的问题。PHPStorm不会显示任何由Gulp任务更改的文件更新。将此代码添加到Gulp任务后,PHPStorm已正确显示更新的文件。为什么
file.stat
file
有时会
未定义
?我必须用一个
if
来包装。也可以正常工作。我不喜欢这是使用默认任务,但是将.pipe(touch())移动到我想要的任何文件都可以工作!任务“默认值”仅用于演示:)谢谢!使用这个基础,我只需要<代码> GUL触摸FD < /COD>插件和<代码> const触摸=要求(“Gulp Tou-FD”);然后我将它添加到
.pipe(browser.reload({stream:true}))前面的
sass`函数中
const {src, dest} = require('gulp');
const touch = require('gulp-touch-fd');

function copyAndTouch() {
  return src('./src/**/*')
    .pipe(dest('./dest'))
    .pipe(touch());
};

exports.copyAndTouch = copyAndTouch