搜索
查看: 4833|回复: 0

[IDE] 发布后与直接运行的区别

   关闭 [复制链接]

188

主题

2545

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
14127
发表于 2016-1-5 11:51:16 | 显示全部楼层 |阅读模式
一般桌面软件开发工具是先生成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兼容版本不一致 - 当然这只有少数兼容性有问题的网页会出问题。我们建议大家在使用web.form控件时最好总是加上 web.form.emulation(11001) 显式的声明IE兼容版本。

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文件时跳过不引用。



评分

参与人数 1银币 +5 收起 理由
honghao71 + 5 很给力!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2020-9-19 22:45 , Processed in 0.078125 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表