Closed otakustay closed 10 years ago
@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
?
我希望可以~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.
看了一下cb-web-fe
的edp-build-config.js
,里面还有一个namespace
的方法,这个东东你打算用什么语法来描述?
这个其实就是foo/*
的功能,但是include
现在不支持*
这种通配符,所以就自己写了个方法,就是主贴的第1点
是不是这么理解:
foo/*
是针对项目代码来用的foo/**
和~foo/**
是对项目依赖的package来用的?如果我写了er/*
,是否有意义呢?如果我项目里面有个src/er
目录,看来是有意义的。
或者对于你这种高级用法,让include
和exclude
支持二维的数组,然后把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'
)
}
};
我的理解是,er/*
只有一层即包含er
和er/foo
,而er/**
,则包含er
、er/foo
和er/foo/bar
如果我写了er/*,是否有意义呢?如果我项目里面有个src/er目录,看来是有意义的
根据require.config
的配置,er/*
只能代表唯一的一个东西,所以如果src/er
存在,也有dep/er
,且require.config
配置确实这2个都叫er
,这东西本身就运行不起来,自然build也不应该通过,通配符也是根据require.config
或者说module.conf
来找的
支持2维数组是个不错的方案,不过还是需要枚举所有的namespace
或package
,考虑到业务扩展后可能要有新的模块出来,namespace
会增加,就要时刻注意维护build-config
,cb-web的打包很精细化,只会把用户经常需要的业务模块打包。但很多项目是把所有模块打包的,此时就希望有include: '*/*'
这种了吧?
如果出现了include: */*
的情况,那么就需要扫描所有的js
文件,得到项目中所有的module id
,然后再去验证是否跟include
里面的pattern想匹配。
扫描所有的js
文件只限定在src
和dep
目录?
不用写死src
和dep
,应该根据module.conf
中的baseUrl
和所有packages
的location
,在这些目录下找所有的.js
文件,扫描得到所有的模块和其依赖,形成模块依赖图,之后再做进一步的处理
大概明白了,我来改改看
写着写着,感觉~er/*
这个东东是没啥用的。例如:
// src/common/main.js
define(function( require ){
var er = require( 'er' );
});
common/main
依赖er
这个模块,那么我想要打包的时候,只把er/**
的内容打包,不需要包含er
依赖的模块,那么就可以这么写了:
{
"common/main": {
"include": [ "er/**" ],
"exclude": [ "*" ]
}
}
~er/*
的支持,其它的功能应该差不多了edp.path.satisfy
跟minimatch
不太一样,所以你写er/**
是不符合预期的嗯,想想exclude: ['*']
确实能实现我要的功能
话说include
和exclude
都存在的时候,规则是啥?先把include
的加上,然后把里面符合exclude
的去掉吗?如果是这样,似乎exclude: ['*']
会导致include
是啥都没用,全被去除了
话说include和exclude都存在的时候,规则是啥?先把include的加上,然后把里面符合exclude的去掉吗?如果是这样,似乎exclude: ['*']会导致include是啥都没用,全被去除了
不是的,所有涉及到include
和exclude
的地方,逻辑都是先exclude
,然后再include
。
针对这个功能新增了一个test case
剩余未解决的一个问题是还没有办法exclude
自己,不过貌似应该影响不大。
问题越来越多,貌似主要跟paths
的配置,以及如何排查重复的模块有关系。
不知道为啥出现了这种情况,还在找复现的方式:
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));
貌似是TplMerge的问题?
貌似没问题了,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: [
先引用下 ecomfe/edp-build#32 ,这个issue是进一步的问题
先来总结下当前的情况:
include
不支持pattern
,只能一个一个列pattern
是glob模式,简单来说:foo
代表foo
模块foo/*
代表foo
下的 一级 模块,如foo/bar
,但foo/alice/bob
不会被计入其中,另外foo
本身也不计其中foo/**
代表foo
下的所有模块,包含任意深度的子模块*foo**
代表任意名称中有foo
的模块,如bar/foo
或者iamnotfoo
这样的edp-build-config.js
是一个CommonJS模块,因此可以动态生成combine
配置我个人觉得理想的方案有以下几点:
foo/*
和foo/**
包含foo
自己,从模块的角度来看这应该是合理的,因为事实上foo
通常是foo/main
之类的模块foo
但不包含foo
的所有依赖”这样的形式,可以使用~foo/*
这种,通过一个前缀来表达“不包含其进一步依赖,即不再进一步分析module的dependenciesinclude
如果可以支持pattern的话最好,不支持也可以动态获取