今天升级了 Sencha Touch到 2.2.1, Sencha Cmd到 3.1.2.342, 创建新工程后, 发现一个诡异的问题.

应该是这样的:

以往, 在工程根路径下, 我习惯把通用的组件或逻辑写在独立的ExtJs Class里, 不和app的model/view/controller混在一起.

大概的路径如下:

+ appbase
++ app
+++ model
+++ view
+++ controller
+++ store
+++ ...
++ Ux  <--自定义的组件位置
+++ foo
++++ bar.js

同时, 在app.js里, 为了支持Ux:

js app.js Ext.Loader.setPath({ 'Ext': 'touch/src', 'MyApp': 'app', 'Ux': 'Ux' });

就可以按这样的形式引用:

    requires: [
        ...
        'Ux.foo.Bar',
        'Ux.foo.Bar2',
        ...

    ],

就好像Ux和ExtJs位于不同的Namespace的感觉, 很大气上档次吧~

可现在的实际情况是:

在升级了 Sencha Cmd 和 Sencha Touch之后, Micro Loader可以正常的运转, 也就是说在浏览器Debug时, 一切都是正常的.

但在打包时, sencha app build package, 糟糕的事情发生了:

[ERR] C2008: Requirement had no matching files (Chat.Api) -- /Users/semicircle/goplace/src/bitbucket.org/semicircle/chatservice/demo/www/app.js:22102
[ERR] The following error occurred while executing this line:
/Users/semicircle/goplace/src/bitbucket.org/semicircle/chatservice/demo/www/.sencha/app/build-impl.xml:256: The following error occurred while executing this line:
/Users/semicircle/goplace/src/bitbucket.org/semicircle/chatservice/demo/www/.sencha/app/build-impl.xml:249: com.sencha.exceptions.ExScript: Wrapped com.sencha.exceptions.ExBuild: Failed to find any files for /Users/semicircle/goplace/src/bitbucket.org/semicircle/chatservice/demo/www/app.js::ClassRequire::Chat.Api (x-app-build#291)
   runAppBuild (x-app-build:291)
   [anonymous] (x-app-build:571)
   x_app_build (x-app-build:569)
   <script> (anonymous:1)

这里的 Chat.Api 就是我想独立出来的模块.

解决方法是这样的:

经过长时间阅读Sencha Cmd的文档, 都没有找到答案, 后来, 无意之间发现了这个: .sencha/app/sencha.cfg

cfg .sencha/app/sencha.cfg 2 ... 3 app.framework=touch 4 5 app.classpath=${app.dir}/app.js,${app.dir}/app, 6 7 app.build.dir=${workspace.build.dir}/${app.name} 8 ...

将这里的 app.classpath增加 ${app.dir}/Ux , 即 app.classpath=${app.dir}/app.js,${app.dir}/app,${app.dir}/Ux 即可实现对 Ux的引用.

这里的变化完全没有记录在任何文档中, 我以前的想法里, Sencha Cmd是同u哦 app.js 里 Ext.Loader的代码来检测到底要如何找ClassPath, 但目前这个机制好像发生了变化, 据(SenchaCmd文档)说这里Ext.Loader不填写, 也能正确加载. 添加新特性的同时, 对Ux的加载被忽略了, 在目前的Sencha版本里, 这个classpath设置成了名副其实的黑魔法, 希望未来的版本能修正这些问题.