    if(isDevelop){
        return rsB
    }else {
        // 再输出到dist_static中做备用比如js中可能异步加载？
        return rsB.pipe(p.rename(p=>{
            // 输出到正式runtime_static
            var diffDir =  path.relative(_opts['runtime_static'], p.dirname),
                newDirname = j(_opts['dist_static'], diffDir)

            p.dirname = newDirname
        }))
       .pipe(gulp.dest('./'))
    }
})


gulp.task('gm:compile-browserify', ['gm:compile-tpl', 'gm:compile-es6'], ()=>{
    return doBrowserify()
})


gulp.task('gm:compile-html', cb=>{

    return parseRawHTML(gulp.src(html_source), null, true)
})


// only used for publish
gulp.task('gm:publish-html', cb=>{
    // the `null` is basepath
    // the `false` is isRuntimeDir
    return parseRawHTML(gulp.src(html_source), null, false)
})


gulp.task('gm:publish-usemin', ()=>{

    let html_src = j(_opts['dist_views'], '**/*.html')

    if(_opts['is_absolute']){
        _opts['usemin']['path'] = _opts['dist_assets']

        var diffPath = path.relative(_opts['dist_views'], _opts['dist_assets'])

        _opts['usemin']['outputRelativePath'] = diffPath
    }


    return gulp.src(html_src)
   .pipe(gulpUsemin(_opts['usemin']))
   .pipe(gulp.dest(_opts['dist_views']))

})


gulp.task('gm:compile', cb => {
    updateSpecificComponentsSource();
    return p.sequence(
        'gm:clean', 
        'gm:compile-copy',
        'gm:compile-css',
        // 由于tpl 中可能需要嵌入css,因此将compile-css和compile-browserify 变成串行
        'gm:compile-browserify',
        'gm:compile-html'
    )(cb)
});


/**
 * FOR DEVELOP WATCHT ================================
 */

/**
 * 因为task不能传参，这里用全局变量来实现，
 * 后续考虑优化
 * @type {[type]}
 */

let _g_update_evt = {

    '_current_event': null,

   'scss': {
        'event': null,
        'task': 'gm:compile-media-check'
    },
   'sprite': {
        'event': null,
        'task': 'gm:compile-media-check'
    },
    'es6': {
        'event': null,
        'task': 'gm:update-js'
    },
    // need browserify
    'tpl': {
        'event': null,
        'task': 'gm:update-tpl'
    }

    
}


function fireUpdate(type, event){

    event['solution'] = type
    _g_update_evt['_current_event'] = _g_update_evt[type]['event'] = event

    let _task = _g_update_evt[type]['task']

    _task && gulp.start(_task)
}


function getUpdateEvent(type){

    if(type){
        return _g_update_evt[type]['event']
    }else {

        return  _g_update_evt['_current_event']
    }
}


function removeUpdateEvent(type){
    if(type){
        _g_update_evt[type] && (_g_update_evt[type]['event'] = null)
    }else {
        _g_update_evt['_current_event'] = null
    }
}


function htmlParseFlow(b, _isRuntimeDir){

    return b.pipe(base64({// 第二步，替换生成html原本内容本身中的base64图片路径, 比如img标签中有?_gm_inline则被替换为base64
        'is_absolute': _opts['is_absolute'],
        'baseDir': _opts['runtime_assets'],
        'url_prefix': _opts['url_prefix'],
        'views': _isRuntimeDir? _opts['runtime_views'] : _opts['dist_views'],
        'dist_assets': _opts['dist_assets'],
        'isDevelop': isDevelop,
        'type': 'html',
        'rule': getB64ImgReg()
    }))
   .on('error', function(err){
        OSInformError('HTML Img-Base64 Error', err, err['message'])
        this.end()
    })
   .pipe(htmlInline({// 第三步，向html中替换插入行内标记的内容

        'is_runtime': _isRuntimeDir,
        'absoluteRoot': _opts['is_absolute']? (_isRuntimeDir? _opts['runtime_assets'] :  _opts['dist_assets']) : false,

        queryKey: '_gm_inline',
        // 选择是否压缩css
        minifyCss: _isRuntimeDir? false : true,
        // 选择是否压缩js, 
        minifyJs: _isRuntimeDir? false : true,  

        'dist_dir': _opts['dist_assets'],
        'runtime_dir': _opts['runtime_assets'],
        'url_prefix': _opts['url_prefix'],

        'root': _cwd
    }))
   .on('error', function(err){
        OSInformError('htmlInline Error', err)
        this.end()
    })
}



// 解析html文件中的资源路径和做处理
function parseRawHTML(b, basepath, _isRuntimeDir) {

    /**
     * @debug 未完成inline后的路径转换
     *
     * 1. 这里inline后需要一个路径转换，比如css中./a.png 当inline到html中，可能变成了../../assets/static/home/a.png，不转换将可能404。
     * 2. 如果将行内内容或者components中全部内容中（可能主要是css的资源引用，js现在没有做资源嵌入）的资源引用都做成绝对路径，那么没有这个问题了。也可以考虑在做inline的时候，转换路径，也就是1。
     */


    // 第一步先计算并替换html的相关路径
    var tb = b.pipe(htmlPathParser({
        '_opts': _opts,
        'basepath': basepath, 
        '_isRuntimeDir': _isRuntimeDir,
        'all_raw_source_reg': all_raw_source_reg
    }))
   .on('error', function(err) {
        OSInformError('ParseHtml Error', err)
        this.end()
    })


    return htmlParseFlow(tb, _isRuntimeDir)
   .pipe(gulp.dest(_isRuntimeDir? _opts['runtime_views'] : _opts['dist_views']))
    
}



function getRelativePathOfComponents(epath) {
    if(epath === undefined) return;

    let comsPath = getComponentsPath()

    return path.relative(comsPath, epath)
}


function translatePathExtname(type, _path){
    var d = {
        'js': function(){
            return _path.replace(/\.(es6|jsx)$/gm, '.js')
        },
        'css': function(){
            return _path.replace(/\.(scss|sass)$/gm, '.css')
        }
    }

    return d[type]()
}


function delChangedFile(epath, delOutDir, type){
    
    let relPath = getRelativePathOfComponents(epath)
    // 这里可以用path的api来