fex-team / fis

Front-end Integrated Solution - 前端集成解决方案, 最新版请进入 FIS3 https://github.com/fex-team/fis3
http://fis.baidu.com
MIT License
2.96k stars 655 forks source link

关于文档deploy一节中的问题 #519

Open dsonet opened 9 years ago

dsonet commented 9 years ago

官网 http://fis.baidu.com/docs/api/fis-conf.html#deploy 文档中,

replace替换多个字符串 需要replace替换多个字符串,可以使用正则的方式。例如: ··· replace : { from : /www.a.com|www.b.com/, to : function(m){ if(m === 'www.a.com') return 'www.x.com'; if(m === 'www.b.com') return 'www.y.com'; } } ··· from正则表达式中应该加入g开关,否则只会替换一个匹配。 另外建议这里的replace支持数组形式。[{from, to}, {from, to}] 刚刚发现数组形式已经实现了,thanks. 最新发现是remote中实现了,但deploy中未实现。希望能实现这个特性。

dsonet commented 9 years ago

//fis-command-release\lib\deploy.js 对replace逻辑的替换

if (dest.replace) {
    var replace = dest.replace;

    if (!Array.isArray(replace)) {
        replace = [replace];
    }

    replace.forEach(function(item) {
        if(item.from) {
            var reg = item.from;

            if(typeof reg === 'string') {
                reg = new RegExp(fis.util.escapeReg(reg), 'g');
            } else if(!(reg instanceof RegExp)) {
                fis.log.error('invalid deploy.replace.from [' + reg + ']');
            }

            content = content.replace(reg, item.to);
        }
    });
}
hefangshi commented 9 years ago

并非只有remote实现了,这部分的替换是通用的,能再核实下么?如果的确有问题请提交一个示例。

dsonet commented 9 years ago

@hefangshi 你看一下 fis-command-release\lib\deploy.js 在使用release --dest 的时候,replace配置为如下,则没有任何效果。

replace: [{
        from: /\/lib\/amazeui\//gi,
        to: '/'
    }]

修改之后才可以。

hefangshi commented 9 years ago

大概知道是什么情况了,应该是你的理解错误

--dest 后面的参数是用于指定发布目标的,发布目标的定义是 deploy 配置的 KEY ,并不专指 remote或者什么,而是可以任意指定的。

fis.config.set('deploy', {
    "targetA": {
        from: '/',
        to: '/home/work/wwwroot',
        replace: {
            from: 'A',
            to: 'B'
        }
    },
    "targetB": {
        from: '/',
        to: '/home/work/wwwroot2',
        replace: {
            from: 'A',
            to: 'C'
        }
    }
});

那么我们在执行 fis release -d targetA 与执行 fis release -d targetB 的时候,执行的是不同的replace规则,与是否是叫 remote 无关。

而你如果没有指定 --dest ,或者指定的 --dest 是一个本地路径,那么由于在 deploy 中没有相应的配置,是不会做替换的。

如果是希望所有的产出无论在什么 deploy 下都生效,你应该在postpackager阶段甚至更前的阶段做替换而非 deploydeploy 中的 replace 是限定在这个 deploy 内的。

dsonet commented 9 years ago

@hefangshi 关于deploy的配置,我理解你说的。我所说的只是这里的replace支持的分组规则适应性有点差罢了哈。

hefangshi commented 9 years ago

@dsonet 我的意思是,replace支持的feature,不会存在remote支持,其他不支持的情况。

dsonet commented 9 years ago

@hefangshi 我现在遇到的是replace不支持数组配置。至于remote我值看了源码实现,并未使用过。