一般桌面软件开发工具是先生成EXE才通运行,例如C++,改几句代码也可能要先编译很久才能运行测试。
在aardio开发环境里有一个功能,就是可以不生成EXE直接运行测试,这非常方便,改代码可以马上看到效果。
但是,由于在IDE(开发环境)中直接运行前并未生成EXE文件,与发布生成EXE文件以后再运行还是会有一些微小的区别。 如果你跟我一样,没有完美主义强迫症,那IDE中直接运行调试的方式还是非常方便的。不过需要注意以下几点。
1、在IDE中直接运行程序,创建进程的EXE文件是aardio.exe,发布后则是你生成的EXE文件。io._exepath, io._exedir 的值都不一样,io.fullpath("~/") 的值也不一样,在aardio中路径前加上"~/"表示创建进程的EXE文件所在目录。但是io.fullpath("/")的值始终是一样的,路径开始如果是一个斜杠表示应用程序目录(发布前为工程目录,发布后为EXE文件所在目录)。
2、发布后运行 _STUDIO_INVOKED的值为null空值,而在IDE中运行普通程序其值为"process" - 这表示IDE为该程序创建了一个独立的进程。如果代码的第一个import语句为 import ide(这种程序只能在IDE中运行),那么在IDE中运行_STUDIO_INVOKED的值为"thread" - 这表示IDE在当前进程中创建了一个线程来运行程序。
3、调用 `web.form.emulation(11001)` 指定 web.form 浏览器控件的 IE 兼容版本时需要注意,这个设置是针对当前 EXE 文件名生效的。例如你加上这句代码运行一次,再去掉这句代码运行一次,他的效果相当于这句代码的作用一直存在。因为在开发环境中直接运行时创建进程的EXE文件名始终是 aardio.exe,如果IE兼容版本被之前的代码改为IE11,而当前代码并没有设置,这就会导致发布前后使用的IE兼容版本不一致 - 当然这只有少数兼容性有问题的网页会出问题。因 IE11 内核已经普及 web.form 控件时已默认自动调用 `web.form.emulation(11001)`
4、当你发布EXE文件时,aardio会首先分析所有引用的库模块,排除没有引用的库,并且提前编译。而在IDE中直接运行代码,并没有这样事先分析引用库并编译的过程 - 并且引用的库模块文件编译顺序不一致,在aardio中有一个常量操作符 ::是在编译时起作用,并且会受到编译顺序的影响,这可能会导致混乱的结果,例如在发布前好好的,发布后报错(或者反过来) 。为了避免这一问题必须牢记在aardio基础语法中规定的规则:
如果用::定义一个常量,那么在所有文件中他必须加上:: ,例如你不能在一个文件中写 ::XXX 在另一个文件中写 XXX 而省略前面的::,并且我们建议大家尽可能不要滥用::操作符,减少使用全局常量,尽可能使用名字空间模块化代码、以及变量。 5、在使用窗口控件时,为了避免大家书写太多的import语句,所有控件的库模块都是按需自动引用的,也就是你使用了listbox控件,就会引用win.ui.ctrl.listbox,在发布时发现你没有使用就会移除这个控件模块。但是有时候aardio可能无分析你使用了哪个控件,例如在HTMLayout的HTML文件中间接的引用了一些窗口控件,这时候就需要显示的添加import语句来声明可能动态引用的控件,例如 import win.ui.ctrl.static
6、有一些代码可能是在生成EXE以后再动态的用 loadcode等函数加载的,也就是说在发布时并没有引用这些代码,那么aardio没有办法预测到你后面可能会需要哪些其他的库模块,那么这种代码你可能在IDE中运行是好好的,但发布后就找不到引用的库,类似这样的情况,应当提前用 import 语句声明后面可能引用到的库(或者把可能用到的库复制到生成的EXE下面的lib目录)
一些技巧提示:
1、可以用 _STUDIO_INVOKED 来判断不同的运行环境,例如
import console;
if( !_STUDIO_INVOKED ){
console.log("发布后的EXE在运行")
}
elseif( _STUDIO_INVOKED == "process"){
console.log("在IDE中创建进程运行")
}
elseif( _STUDIO_INVOKED == "thread"){
console.log("在IDE中创建线程运行")
}
console.pause(true); 2、对于一些后期可能动态加载的库,但是目前并不想提前加载,可以把import语句写到注释里,例如: /*
import win.ui.ctrl.static
*/
aardio允许用这种方式声明EXE需要用到的库文件,但是在执行时并不引入。
3、对于一些希望在IDE中引用,但又并不希望在发布时编译到EXE文件中的库,可以用下面的方式导入:
if( _STUDIO_INVOKED ){
global.import("console");
} aardio允许你用global.import() 函数引用一个库,但是在发布为EXE文件时跳过不引用。
|