【Gulp Tips】如何删除文件
前缀
今天在坛子里有人问到如何删除文件,后来就顺便看了看。做个记录,也做分享。
PS: 问题详情
什么时候需要删除文件
在前端项目中,buid文件是每一次build都会产生的,为了防止上一次build的文件和这次build的文件都存在,最好是删除上一次的build文件。
有时候项目中也回产生一些temp文件,这个文件只是作为一个中间过渡作用,用完就应该删除。
如何使用del
删除文件上,使用del
这个库相当不错。用法也很简单。
用法一:直接调用删除
例如:
config = require '../config'
gulp = require 'gulp'
del = require 'del'
gulp.task 'clean', (cb)->
del [config.dist.root], cb
用法二:在pipeline中删除
var gulp = require('gulp');
var stripDebug = require('gulp-strip-debug');
var del = require('del');
var vinylPaths = require('vinyl-paths');
gulp.task('delete', function () {
return gulp.src('app/*')
.pipe(stripDebug())
.pipe(vinylPaths(del));
});
这需要注意的是,在pipeline中删除的就是该流中vinyl file的路径,假设说,在gulp.dest()
之后用pipeline删除,其中的path就是指gulp.dest
之后的路径。
例如:
gulp.task('delete2', function (cb) {
var vp = vinylPaths();
gulp.src('app/*')
.pipe(vp)
.pipe(gulp.dest('dist'))
.on('end', function () {
del(vp.paths, cb);
});
});
错误的用法
之前有个网友提了个问题,点击此处查看。
错误的用法就是,没能理解vinly file path
的含义,每次gulp.dest
之后,vinly file path
会改变成gulp.dest
之后。
如何去分析这个错误
为了验证这个错误,可以如下代码来测试:
gulp.task 'vp', ->
gulp.src ['./.temp/templates/**/*.js']
.pipe gulp.dest './.temp/vp'
.pipe through.obj (file, enc, callback)->
console.log file.path
callback()
output:
/Users/soliury/soliury/work/git/ngFast/.temp/vp/templates.js
/Users/soliury/soliury/work/git/ngFast/.temp/vp/templates_v0.2.11.js
/Users/soliury/soliury/work/git/ngFast/.temp/vp/templates_v0.2.12.js
从上可知,在gulp.dest之后的vinly file
的路径变成了dest之后的路径,并不是原来的路径。
稍微改动一下上面的代码,可以更加清晰地了解vinylPaths
的作用。
gulp.task 'vp', ->
vpBefore = vinylPaths()
vpAfter = vinylPaths()
gulp.src ['./.temp/templates/**/*.js']
.pipe vpBefore
.pipe gulp.dest './.temp/vp'
.pipe vpAfter
.on 'end', ()->
console.log 'before:'
console.log vpBefore.paths
console.log 'after'
console.log vpAfter.paths
output:
before:
[ '/Users/soliury/soliury/work/git/ngFast/.temp/templates/templates.js',
'/Users/soliury/soliury/work/git/ngFast/.temp/templates/templates_v0.2.11.js',
'/Users/soliury/soliury/work/git/ngFast/.temp/templates/templates_v0.2.12.js' ]
after
[ '/Users/soliury/soliury/work/git/ngFast/.temp/vp/templates.js',
'/Users/soliury/soliury/work/git/ngFast/.temp/vp/templates_v0.2.11.js',
'/Users/soliury/soliury/work/git/ngFast/.temp/vp/templates_v0.2.12.js' ]
所以在什么地方pipe vinypath就会把当时的path记录下来。所以想要删除哪个路径就用vinypath记录下来,然后在stream end的时候调用del删除就可以了。
完整的例子
gulp = require 'gulp'
templateCache = require 'gulp-angular-templatecache'
htmlmin = require 'gulp-htmlmin'
gulpif = require 'gulp-if'
htmlreplace = require 'gulp-html-replace'
duration = require 'gulp-duration'
source = require 'vinyl-source-stream'
browserify = require 'browserify'
transform = require 'vinyl-transform'
browserSync = require 'browser-sync'
rename = require 'gulp-rename'
vinylPaths = require 'vinyl-paths'
del = require 'del'
through = require 'through2'
config = require '../config'
gulp.task 'views', (cb)->
{isDebug} = global
vp = vinylPaths()
browserified = transform (filename)->
b = browserify()
b.require 'templates.js'
b.bundle()
name = 'templates.js'
if not isDebug
name = "templates_v#{global.versionTag}.js"
gulp.src config.views.src
.pipe gulpif isDebug, htmlmin
removeComments: true
collapseWhitespace: true
.pipe templateCache name,
standalone: true
.pipe gulp.dest './.temp/templates'
.pipe vp
.pipe browserified
.pipe gulp.dest config.scripts.dest
.pipe browserSync.reload
stream: true
.on 'end', ->
del vp.paths
从以上的代码可以看出,views
任务主要用来将所有的html页面打包成一个angular module,然后写入templates.js
文件中去,而且可以作为browserify包对外引用。
其中一个./.temp/templates
是暂存文件的,一般来说,用过以后就应该删除的。所以我在.pipe gulp.dest './.temp/templates'
后加了一句.pipe vp
,将此时的文件路径记录下来。然后在整个stream end之后调用del删除暂存文件。