ecomfe / edp

ecomfe develop platform
546 stars 171 forks source link

combine配置的方式 #136

Closed otakustay closed 10 years ago

otakustay commented 10 years ago

先引用下 ecomfe/edp-build#32 ,这个issue是进一步的问题

先来总结下当前的情况:

  1. include不支持pattern,只能一个一个列
  2. 现有的pattern是glob模式,简单来说:
    • foo代表foo模块
    • foo/*代表foo下的 一级 模块,如foo/bar,但foo/alice/bob不会被计入其中,另外foo本身也不计其中
    • foo/**代表foo下的所有模块,包含任意深度的子模块
    • 当然还有其它的匹配,如*foo**代表任意名称中有foo的模块,如bar/foo或者iamnotfoo这样的
  3. 由于edp-build-config.js是一个CommonJS模块,因此可以动态生成combine配置

我个人觉得理想的方案有以下几点:

  1. foo/*foo/**包含foo自己,从模块的角度来看这应该是合理的,因为事实上foo通常是foo/main之类的模块
  2. 支持“包含foo但不包含foo的所有依赖”这样的形式,可以使用~foo/*这种,通过一个前缀来表达“不包含其进一步依赖,即不再进一步分析module的dependencies
  3. include如果可以支持pattern的话最好,不支持也可以动态获取
leeight commented 10 years ago

@otakustay

让foo/和foo/*包含foo自己,从模块的角度来看这应该是合理的,因为事实上foo通常是foo/main之类的模块

如果是这样子配置的话:

exclude: [
  'foo/**'
]

那么我处理之前自动补充上fooexclude里面去,应该能满足你的需求了吧


支持“包含foo但不包含foo的所有依赖”这样的形式,可以使用~foo/*这种,通过一个前缀来表达“不包含其进一步依赖,即不再进一步分析module的dependencies

我感觉没有必要了,因为如果上面的功能支持了,那你完全可以这么写了:

include: [ 'foo' ],
exclude: [ 'foo/**' ]

foo的所有依赖指的是foo/**么?还是foo/main.js里面的require

otakustay commented 10 years ago

我希望可以~er/包含所有er的模块,但不包含er依赖的第三方库比如mini-event或etpl,即按原来的逻辑获取所有符合er/的模块及相关依赖模块形成一个数组,再从中去除所有不符合er/**这个表达式的模块

在 2014年3月19日,14:46,leeight notifications@github.com 写道:

@otakustay

让foo/和foo/*包含foo自己,从模块的角度来看这应该是合理的,因为事实上foo通常是foo/main之类的模块

如果是这样子配置的话:

exclude: [ 'foo/**' ] 那么我处理之前自动补充上foo到exclude里面去,应该能满足你的需求了吧

支持“包含foo但不包含foo的所有依赖”这样的形式,可以使用~foo/*这种,通过一个前缀来表达“不包含其进一步依赖,即不再进一步分析module的dependencies

我感觉没有必要了,因为如果上面的功能支持了,那你完全可以这么写了:

include: [ 'foo' ], exclude: [ 'foo/' ] foo的所有依赖指的是foo/么?还是foo/main.js里面的require?

— Reply to this email directly or view it on GitHub.

leeight commented 10 years ago

看了一下cb-web-feedp-build-config.js,里面还有一个namespace的方法,这个东东你打算用什么语法来描述?

otakustay commented 10 years ago

这个其实就是foo/*的功能,但是include现在不支持*这种通配符,所以就自己写了个方法,就是主贴的第1点

leeight commented 10 years ago

是不是这么理解:

如果我写了er/*,是否有意义呢?如果我项目里面有个src/er目录,看来是有意义的。

leeight commented 10 years ago

或者对于你这种高级用法,让includeexclude支持二维的数组,然后把package, namespace变成内置的函数,是否也OK?这样子就不需要修改语法了。

// 3个启动脚本
var config = {
    'startup/ui': {
        include: [ 'moment/lang/zh-cn', package('esui') ],
        exclude: [ 'esui/Sidebar' ]
    },
    'startup/ria': {
        include: [
            'echarts', 'echarts/chart/line', 'echarts/chart/bar', 'common/extension',
            namespace('common/extension'),
            package('er', 'ef', 'ub-ria', 'er-track', 'etpl', 'saber-cookie'),

        ],
        exclude: package('mini-event', 'moment', 'underscore', 'esui')
    },
    'startup/biz': {
        include: [
            'report/delivery/Dashboard', 'report/slot/Dashboard', 'report/order/Dashboard'
            namespace('common', 'ui', 'error', 'bulletin'),
            namespace('dashboard', 'slot', 'order', 'delivery'),
            bizUIModules
        ],
        exclude: package(
            'mini-event', 'moment', 'underscore', 'saber-cookie',
            'etpl', 'er', 'er-track', 'ef', 'echarts', 'esui', 'ub-ria'
        )
    }
};
otakustay commented 10 years ago

我的理解是,er/*只有一层即包含erer/foo,而er/**,则包含erer/fooer/foo/bar

如果我写了er/*,是否有意义呢?如果我项目里面有个src/er目录,看来是有意义的

根据require.config的配置,er/*只能代表唯一的一个东西,所以如果src/er存在,也有dep/er,且require.config配置确实这2个都叫er,这东西本身就运行不起来,自然build也不应该通过,通配符也是根据require.config或者说module.conf来找的

otakustay commented 10 years ago

支持2维数组是个不错的方案,不过还是需要枚举所有的namespacepackage,考虑到业务扩展后可能要有新的模块出来,namespace会增加,就要时刻注意维护build-config,cb-web的打包很精细化,只会把用户经常需要的业务模块打包。但很多项目是把所有模块打包的,此时就希望有include: '*/*'这种了吧?

leeight commented 10 years ago

如果出现了include: */*的情况,那么就需要扫描所有的js文件,得到项目中所有的module id,然后再去验证是否跟include里面的pattern想匹配。

扫描所有的js文件只限定在srcdep目录?

otakustay commented 10 years ago

不用写死srcdep,应该根据module.conf中的baseUrl和所有packageslocation,在这些目录下找所有的.js文件,扫描得到所有的模块和其依赖,形成模块依赖图,之后再做进一步的处理

leeight commented 10 years ago

大概明白了,我来改改看

leeight commented 10 years ago

写着写着,感觉~er/*这个东东是没啥用的。例如:

// src/common/main.js
define(function( require ){
  var er = require( 'er' );
});

common/main依赖er这个模块,那么我想要打包的时候,只把er/**的内容打包,不需要包含er依赖的模块,那么就可以这么写了:

{
  "common/main": {
    "include": [ "er/**" ],
    "exclude": [ "*" ]
  }
}
leeight commented 10 years ago
  1. 除了没有~er/*的支持,其它的功能应该差不多了
  2. 另外的问题就是edp.path.satisfyminimatch不太一样,所以你写er/**是不符合预期的
otakustay commented 10 years ago

嗯,想想exclude: ['*']确实能实现我要的功能

话说includeexclude都存在的时候,规则是啥?先把include的加上,然后把里面符合exclude的去掉吗?如果是这样,似乎exclude: ['*']会导致include是啥都没用,全被去除了

leeight commented 10 years ago

话说include和exclude都存在的时候,规则是啥?先把include的加上,然后把里面符合exclude的去掉吗?如果是这样,似乎exclude: ['*']会导致include是啥都没用,全被去除了

不是的,所有涉及到includeexclude的地方,逻辑都是先exclude,然后再include

针对这个功能新增了一个test case

剩余未解决的一个问题是还没有办法exclude自己,不过貌似应该影响不大。

leeight commented 10 years ago

问题越来越多,貌似主要跟paths的配置,以及如何排查重复的模块有关系。

leeight commented 10 years ago

不知道为啥出现了这种情况,还在找复现的方式:

define('etpl/main', etpl);
(function (root) {
    function Engine() {
    }
    ;
    var etpl = new Engine();
    etpl.Engine = Engine;
    if (typeof exports == 'object' && typeof module == 'object') {
        exports = module.exports = etpl;
    } else if (typeof define == 'function' && define.amd) {
        define('etpl', ['etpl/main'], function (main) {
            return main;
        });
    } else {
        root.etpl = etpl;
    }
}(this));
leeight commented 10 years ago

貌似是TplMerge的问题?

leeight commented 10 years ago

貌似没问题了,build之后无法使用的问题是TplMerge导致的。

Index: edp-build-config.js
===================================================================
--- edp-build-config.js (revision 14671)
+++ edp-build-config.js (working copy)
@@ -44,29 +44,29 @@
  * @type {Array}
  */
 exports.exclude = [
-    '/src/static/tpl/*',
-    '/tool',
-    '/doc',
-    '/test',
-    '/mockup',
-    '/demo',
-    '/copyright.txt',
+    'src/static/tpl/*',
+    'tool',
+    'doc',
+    'test',
+    'mockup',
+    'demo',
+    'copyright.txt',
     // '/index-debug.html',
-    '/index-qa.html',
-    '/module.conf',
-    '/dep/packages.manifest',
-    '/dep/*/*/test',
-    '/dep/*/*/doc',
-    '/dep/*/*/demo',
-    '/dep/*/*/example',
-    '/dep/*/*/tool',
-    '/dep/*/*/jsduck',
-    '/dep/*/*/*.md',
-    '/dep/*/*/package.json',
-    '/dep/echarts/*/src/util/mapData/rawData/china/*.js',
-    '/dep/echarts/*/src/util/mapData/rawData/*.js',
-    '/edp-*',
-    '/.edpproj',
+    'index-qa.html',
+    'module.conf',
+    'dep/packages.manifest',
+    'dep/*/*/test',
+    'dep/*/*/doc',
+    'dep/*/*/demo',
+    'dep/*/*/example',
+    'dep/*/*/tool',
+    'dep/*/*/jsduck',
+    'dep/*/*/*.md',
+    'dep/*/*/package.json',
+    'dep/echarts/*/src/util/mapData/rawData/china/*.js',
+    'dep/echarts/*/src/util/mapData/rawData/*.js',
+    'edp-*',
+    '.edpproj',
     '.svn',
     '.git',
     '.gitignore',
@@ -93,14 +93,7 @@
     return [
         new AddViewName(),
         new LessCompiler({
-            exclude: [
-                'src/ui/css/*.less',
-                'src/common/css/*.less',
-                'src/*/css/*.less',
-                'src/*/*/css/*.less',
-                'src/*/ui/css/*.less',
-                'src/*/*/ui/css/*.less'
-            ],
+            exclude: [ '*.less' ],
             include: [
                 'src/common/css/extern.less',
                 'src/common/css/main.less',
@@ -113,6 +106,7 @@
         new ModuleCompiler({
             exclude: [
                 'dep/etpl/*/src/main.js',
+                'dep/etpl/*/main.js',
                 'dep/jquery/*/src/jquery.js',
                 'dep/jquery/*/src/jquery.min.js',
                 'src/external/esl.js',
@@ -122,46 +116,47 @@
                 'src/static/header.js'
             ],
             getCombineConfig: function () {
-                var bizNamespaces = getBizNamespaces();
-
-                var bizUIModules = [];
-                bizNamespaces
-                    .map(function (namespace) { return namespace + '/ui'; })
-                    .forEach(function (bizNamespace) { bizUIModules.push.apply(bizUIModules, namespace(bizNamespace)); });
-
                 // 3个启动脚本
                 var config = {
                     'startup/ui': {
-                        include: ['moment/lang/zh-cn'].concat(package('esui')),
+                        fileset: [ 'moment/lang/zh-cn', 'esui/**', '!esui/Sidebar' ]
+                    },
+                    'startup/ria': {
+                        include: [
+                            'echarts', 'echarts/chart/line', 'echarts/chart/bar',
+                            'er/**', 'ef/**', 'ub-ria/**', 'er-track/**', 'etpl/**', 'saber-cookie/**',
+                            'common/extension/**'
+                        ],
                         exclude: [
-                            'esui/Sidebar' // `Sidebar`用自己的
+                            'mini-event/**', 'moment/**', 'underscore/**', 'esui/**', 'ui/**', 'common/**', 'error/**'
                         ]
                     },
-                    'startup/ria': {
-                        include: ['echarts', 'echarts/chart/line', 'echarts/chart/bar']
-                            .concat(package('er', 'ef', 'ub-ria', 'er-track', 'etpl', 'saber-cookie'))
-                            .concat('common/extension')
-                            .concat(namespace('common/extension')),
-                        exclude: package('mini-event', 'moment', 'underscore', 'esui')
-                    },
                     'startup/biz': {
-                        include: ['report/delivery/Dashboard', 'report/slot/Dashboard', 'report/order/Dashboard']
-                            .concat(namespace('common', 'ui', 'error', 'bulletin'))
-                            .concat(namespace('dashboard', 'slot', 'order', 'delivery'))
-                            .concat(bizUIModules),
-                        exclude: package(
-                            'mini-event', 'moment', 'underscore', 'saber-cookie',
-                            'etpl', 'er', 'er-track', 'ef', 'echarts', 'esui', 'ub-ria'
-                        )
+                        include: [
+                            'report/delivery/Dashboard', 'report/slot/Dashboard', 'report/order/Dashboard',
+                            'common/**', 'ui/**', 'error/**', 'bulletin/**', 'dashboard/**', 'slot/**', 'order/**', 'delivery/**',
+                            /^[\w]+\/ui\//,
+                            /^tool\/[\w]+\/ui\//
+                        ],
+                        exclude: [
+                            'mini-event/**', 'moment/**', 'underscore/**', 'saber-cookie/**', 'etpl/**',
+                            'er/**', 'er-track/**', 'ef/**', 'echarts/**', 'esui/**', 'ub-ria/**',
+                            'common/extension/**'
+                        ]
                     }
                 };

-                var baseModules = namespace('common', 'ui')
-                    .concat(package('er', 'ef', 'ub-ria', 'er-track', 'etpl', 'saber-cookie'))
-                    .concat(package('esui', 'echarts', 'zrender', 'mini-event', 'underscore', 'moment'));
+                var bizNamespaces = getBizNamespaces();
+                var exclude = [
+                    // startup/biz里面已经包含了
+                    /^[\w]+\/ui\//,
+                    /^tool\/[\w]+\/ui\//,
+                    'common/**', 'ui/**', 'er/**', 'ef/**', 'ub-ria/**', 'er-track/**',
+                    'etpl/**', 'saber-cookie/**', 'esui/**', 'echarts/**', 'zrender/**', 'mini-event/**',
+                    'underscore/**', 'moment/**'
+                ];

                 bizNamespaces.forEach(function (bizNamespace) {
-                    var exclude = baseModules.concat(bizNamespace + '/ui');
                     // 通用
                     config[bizNamespace + '/List'] = { exclude: exclude };
                     config[bizNamespace + '/Form'] = { exclude: exclude };
@@ -178,12 +173,14 @@
             configFile: 'module.conf',
             entryExtnames: moduleEntries
         }),
+        /*
         new TplMerge({
             exclude: [
                 'src/external/*',
-                'src/static/*'
+                'src/static/*',
+                'dep/etpl/2.0.10/main.js'
             ]
-        }),
+        }),*/
         // new JsCompressor(),
         new PathMapper({
             replacements: [