是否可以创建一个'命令行'swf?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以创建一个'命令行'swf?相关的知识,希望对你有一定的参考价值。
我希望能够编写一个可以作为命令行应用程序运行的.swf文件。换句话说,我将能够创建可以与stdin和stdout交互的actionscript类,然后可以直接在命令行中执行.swf。
我怀疑这不可能。任何人都可以确认吗?
编辑:一些答案指出,使用Flash进行命令行工作可能不是最好的选择。我在大多数情况下都完全同意。我之所以要问这个是因为我想做一些AS3代码生成,并且在运行时内反映AS3类比解析代码或走Asdoc产生的中间XML更容易。我现在正在Ruby中使用XML方法,但是希望有一个更清洁的解决方案!
不 - 不可能。您可以做的最好的是一个独立的应用程序(可以在Flash中制作,也可以使用Adobe网站上提供的Flash播放器的投影仪版本)。
为什么你想要 - 由于出色的GUI功能,Flash很棒。有很多其他编程语言更适合命令行(Python或Ruby,或者上帝禁止,甚至是Perl)
你可以看看Haxe与AS3非常相似,可以编译NekoVM字节码,可以在命令行上运行。
同样有趣的可能是HippoHX,它是一种用闪存电影创建桌面应用程序的框架。 (类似于AIR,但具有对系统的完全访问权限。)
是!它实际上是可能的。
您可以创建纯AS3 AIR项目(不带任何应用程序窗口),并使用ADL(AIR Debug Launcher)从命令行运行。
ADL将执行您的SWF,并将在运行时将您提供的任何参数直接传递给您的应用程序 - 所有这些都来自命令行!要从AS3读取参数,只需将此代码添加到主类:
package
{
import flash.desktop.NativeApplication;
import flash.display.Sprite;
import flash.events.InvokeEvent;
public class CmdLine extends Sprite
{
public function CmdLine()
{
NativeApplication.nativeApplication.addEventListener(
InvokeEvent.INVOKE, onInvokeEvent);
function onInvokeEvent(invocation:InvokeEvent):void {
trace(invocation.arguments);
}
}
}
}
您的主类仍将扩展Sprite
,但除非您创建NativeWindow
对象,否则您将看不到任何UI。如果您正在使用Flash Builder,只需创建一个新的AIR项目,并将主.mxml
文件的扩展名重命名为.as
(在完成向导之前)。
这里有更多关于ADL:Using the AIR Debug Launcher (ADL)
此外,这将非常有用:AIR application invocation and termination
您可以使用trace()
完成所有输出,写入文件,甚至直接写入stdout,如here所示。
显然有Tamarin项目旨在创建AS3的开源实现。 This page给出了编译AS3脚本并从命令行运行它的一些细节。
我对Tamarin的稳定性并不了解,但现在可能是你最好的选择。另一方面,我必须非常同意@zenazn你最好长期学习一种更适合一般用途的语言,但如果真的想要使用Actionscript,不要让任何人阻止你:)
现在没有办法用裸SWF做到这一点。
但是,您可以将Flash内容发布为AIR应用程序。然后可以从命令行调用该应用程序,您可以从arguments的InvokeEvent属性中收集参数。基本思想如下:
NativeApplication.nativeApplication.addEventListener(
InvokeEvent.INVOKE, onInvoke );
// ...
function onInvoke( e:InvokeEvent ) {
var numArguments:int = e.arguments.length;
// ...
}
但请注意,这基本上是一条单行道。你可以获取命令行参数,但Flash仍然没有理解stdin和stdout的想法。
实际上,有一个项目可以实现。 RedTamarin是一个扩展AS3(技术上是Tamarin项目,即Adobe / Mozilla ECMAScript项目)的项目,可以访问低级库(即POSIX)。在目前的状态下,对于类似shell脚本的程序这样的东西似乎很有用,这听起来像你正在寻找的东西。
试试看:
http://code.google.com/p/redtamarin/
您可以使用redtamarin与stdin,stdout和stderr进行交互
http://code.google.com/p/redtamarin/
请参阅示例/文档
http://code.google.com/p/redtamarin/wiki/System#stdout
http://code.google.com/p/redtamarin/wiki/System#stderr
http://code.google.com/p/redtamarin/wiki/System#stdin
Flash和ActionScript 3之间存在差异Flash是一种运行时,AS3是一种语言
我不明白为什么AS3不适合命令行和/或服务器端的编程语言
现在,redtamarin就是这个,它允许您在命令行上运行AS3源代码。
此外,根据您的需要,您可以以不同的方式使用它
- 在命令行上运行脚本 $ ./redshell myscript.as
- 在命令行上运行ABC或SWF文件 $ ./redshell myscript.abc $ ./redshell myscript.swf
- 运行可执行文件 $ ./script
当您运行AS3脚本时,它将被动态解释,使用ASC您将能够将此相同的脚本编译为也可以从命令行运行的ABC文件。
例如,如果需要将多个ABC文件组合在一起,可以使用swfmake将它们合并到SWF文件中,运行时也可以从命令行运行该SWF文件。
最后,如果需要将所有内容捆绑在一个可执行文件中,则可以使用createprojector获取ABC或SWF文件,并将其与运行时本身合并以获取独立的可执行文件。
Redtamarin提供本机API,涵盖文件系统访问,套接字,操作系统信息等。
现在可以使用AIR 2.0。检查this article开始。
如果你真的那么倾向,你可以打开一个本地套接字,然后有一个帮助程序,从命令行运行与打开的SWF通信。
这可能是学习另一种语言的好时机。我可以建议Java吗?
我最近有一个类似的问题。我花了几天时间自己回答它,但你可以创建一个.swf并完全从命令行执行它。
以上是关于是否可以创建一个'命令行'swf?的主要内容,如果未能解决你的问题,请参考以下文章