Node.js Gulp:如何更改文件的修改时间
我在下面有一个gulp任务,每次运行这个任务时(在browsersync之前),我都想更改一个文件的最后修改时间(该文件中没有任何更改,我只需要更改最后修改的时间-替代shell“touch”命令)。谁能告诉我最简单的方法是什么?谢谢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.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
模块的功能,这是与Unixtouch
命令类似的节点。你传递路径,如果你传递一个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