是否可以创建“命令行”swf?

Posted

技术标签:

【中文标题】是否可以创建“命令行”swf?【英文标题】:Is it possible to create a 'command line' swf? 【发布时间】:2010-11-06 13:31:33 【问题描述】:

我希望能够编写一个可作为命令行应用程序运行的 .swf 文件。换句话说,我将能够创建可以与标准输入和标准输出交互的动作脚本类,然后可以直接在命令行中执行该 .swf。

我怀疑这是不可能的。谁能确认一下?

编辑: 一些答案指出,使用 Flash 进行命令行工作可能不是最佳选择。在大多数情况下,我完全同意。我之所以问这个问题是因为我想做一些 AS3 代码生成,并且在运行时中反映 AS3 类比解析代码或遍历 asdoc 生成的中间 XML 更容易。我现在在 Ruby 中使用 XML 方法,但希望有一个更清洁的解决方案!

【问题讨论】:

如果将您的逻辑放入 AS3 可以节省大量精力,那么在标准输入/标准输出和带有 Flash 或 AIR 的套接字连接之间用 Ruby(或其他)搭建一座桥梁可能是值得的应用程序。例如,Ruby 可以使用端口作为参数调用 AIR 应用程序,等待连接,然后开始双向管道。如果您假装您的 Socket/XMLSocket 是标准输入/输出的管道,AS3 端将按照您的描述工作。 哦,现在这是一个有趣的方法!我昨晚刚刚在阅读有关 as3 中的 amqp 客户端的信息。我可能会使用rabbitMQ或类似于在ruby驱动程序和正在提取代码的as3 swf之间传递的代理消息。 我已经用 Java 做了一些类似的事情来解决 AIR 无法监听传入连接的问题。我在 Java 中使用了 xsocket,在 flash 端使用了 XMLSocket,但并没有太多的东西。在 Java 方面,我桥接到 TCPIP 端口,而不是 stdout/in,但我认为它并没有太大的不同.. 复制***.com/questions/9440435/… 完全有可能,你甚至可以用redtamarin 导入任何你喜欢的C 库,见code.google.com/p/redtamarin 真的很棒。 【参考方案1】:

是的!这实际上可能的。

您可以创建一个纯 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,但您不会看到任何 UI,除非您创建 NativeWindow 对象。如果您使用的是 Flash Builder,只需创建一个新的 AIR 项目并将主 .mxml 文件的扩展名重命名为 .as(在完成向导之前)。

这里是关于 ADL 的更多信息:Using the AIR Debug Launcher (ADL)

另外,这将非常有用:AIR application invocation and termination

您可以使用trace() 完成所有输出、写入文件,甚至直接写入标准输出,如here 所示。

【讨论】:

【参考方案2】:

显然有Tamarin 项目旨在创建AS3 的开源实现。 This page 提供了一些关于编译 AS3 脚本并从命令行运行它的细节。

我不太了解 Tamarin 的稳定性,但它可能是您目前最好的选择。另一方面,我必须强烈同意 @zenazn 的观点,即您最好长期学习一门专为通用目的而设计的语言,但如果 真的 只想使用 Actionscript,请不要让任何人阻止你:)

【讨论】:

Tamarin 是在 Flash Player 9+ 中执行编译的 ActionScript 操作码(ABC 或 Actionscript 字节码)的 AVM2 虚拟机。 Adobe 已将此 VM 捐赠给 Mozilla 基金会,希望他们能将其与 FireFox 集成,以 JIT 编译(及时)javascript 到 ABC,从而在浏览器中更快地执行。类似于 Google 对 Chrome/Chromium 所做的事情。 Tamarin 现在已经过时/失效了。【参考方案3】:

目前无法使用纯 SWF 执行此操作。

但是,您可以将 Flash 内容发布为 AIR 应用程序。然后可以从命令行调用该应用程序,并且您可以从InvokeEvent 的arguments 属性中收集参数。基本思路是这样的:

NativeApplication.nativeApplication.addEventListener( 
            InvokeEvent.INVOKE, onInvoke );
// ...
function onInvoke( e:InvokeEvent ) 
    var numArguments:int = e.arguments.length;
    // ...

但请注意,这实际上是一条单行道。您可以获取命令行参数,但 Flash 仍然无法理解标准输入和标准输出的概念。

【讨论】:

【参考方案4】:

实际上,有一个项目使之成为可能。 RedTamarin 是一个扩展 AS3 的项目(技术上,Tamarin 项目是 Adob​​e/Mozilla ECMAScript 项目)以访问低级库(即 POSIX)。在目前的状态下,它似乎适用于类似于 shell 脚本的程序,这听起来就像您正在寻找的那样。

试一试:

http://code.google.com/p/redtamarin/

【讨论】:

【参考方案5】:

您可以使用 redtamarin 与标准输入、标准输出和标准错误进行交互

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

    运行一个可执行文件

    $ ./myscript

当您运行 AS3 脚本时,它将被动态解释, 使用 ASC,您将能够将相同的脚本编译为 ABC 文件 也可以从命令行运行。

例如,如果您需要将多个 ABC 文件组合在一起, 您可以使用 swfmake 将它们合并到 SWF 文件和运行时 也会从命令行运行该 SWF 文件。

最后,如果您需要将所有内容捆绑到一个可执行文件中, 您可以使用 createprojector 来获取您的 ABC 或 SWF 文件 并将其与运行时本身合并以获得独立的 可执行文件。

Redtamarin 提供涵盖文件系统访问的原生 API, 套接字、操作系统信息等。

【讨论】:

【参考方案6】:

现在可以使用 AIR 2.0。检查this article 开始。

【讨论】:

【参考方案7】:

如果你真的那么喜欢,你可以打开一个本地套接字,然后有一个帮助程序,从命令行运行与打开的 SWF 通信。

这可能是学习另一种语言的好时机。我可以推荐 Java 吗?

【讨论】:

【参考方案8】:

我最近有一个类似的问题。我花了几天时间自己回答,但您可以创建一个 .swf 并完全从命令行执行它。

AS3 Filesystem Hello World

【讨论】:

【参考方案9】:

你可以看看Haxe,它与AS3非常相似,可以编译NekoVM字节码,可以在命令行上运行。

HippoHX 也很有趣,它是一种用 Flash 电影创建桌面应用程序的框架。 (类似于 AIR,但可以完全访问系统。)

【讨论】:

【参考方案10】:

不——不可能。您可以做的最好的事情是一个独立的应用程序(可以用 Flash 或 Flash 播放器的投影仪版本制作,可从 Adob​​e 网站获得)。

您为什么要这样做——Flash 非常棒,因为它具有强大的 GUI 功能。还有很多其他更适合命令行的编程语言(Python 或 Ruby,或者,上帝保佑,甚至 Perl)

【讨论】:

感谢您的回复。我向我添加了一个解释,为什么我想在命令行上使用 as3。 这个答案并不完全正确,通过命令行执行 SWF 有多种方法可以完成。

以上是关于是否可以创建“命令行”swf?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从命令行发布 FLA?

是否可以从命令行创建网站应用程序发布配置文件?

创建函数-----------(在.bashrc文件中定义函数在命令行创建函数在命令行中使用函数)

是否可以通过命令行删除 Github 上的远程存储库?

使用 MXMLC 从命令行编译动作脚本

从命令行创建空的 sqlite db