【问题标题】:How to determine what files MXMLC compiles如何确定 MXMLC 编译的文件
【发布时间】:2011-03-02 22:09:49
【问题描述】:

我需要一种以编程方式记录 MXMLC 编译中使用的源文件的方法。理想情况下,将有一个标志传递给 MXMLC,让它报告正在编译的源文件的完整列表,但似乎没有这样的标志。通常,您似乎只需将 main.mxml 文件传递​​给 MXMLC,然后它就会启动并编译所需的所有内容,而不会告诉您它在做什么。据我所知,您也无法明确列出要编译的文件;它将自动解析引用并编译引用的源,而无需任何方式来控制该行为或对其进行报告。

如果编译器无法提供此信息并且用户无法控制此行为,我能想到的唯一其他选择是编写我自己的 MXML 源代码扫描器,它将遍历代码树中的所有引用以给出报告MXMLC 应该 编译什么,虽然这显然容易出错,而且我当然不期待。

当然,由于我对 Flex 没有丰富的经验,所以我可能缺少一个明显的答案。

谢谢

【问题讨论】:

    标签: apache-flex compiler-construction mxmlc


    【解决方案1】:

    你应该在链接报告中找到你想要的:

    将此参数添加到您的编译器参数中:

    -link-report output.xml
    

    它为您提供了大量信息,因此还有一个 handy AIR tool 用于解析结果。

    【讨论】:

    • 嗯,现在我觉得自己有点傻,因为我自己付出了所有努力来编写解决方案(加上已经查看了数小时和数小时的编译器文档)。我仍然有点喜欢我的解决方案,因为它包含我需要的信息,没有其他需要整理的信息。但是,出于一般目的,这确实是最好的答案。谢谢!
    【解决方案2】:

    我实际上不知道并且想知道一种通过命令行执行您所说的方法,那会很棒。但是如果没有这样做的能力,我相信您可以使用反编译器来检查您的 swf,我很确定 Trillix 之类的东西会向您展示所有已编译的类(它们从哪里解决是另一回事)。要查看访问了哪些文件,您可以(如果您使用的是 Windows)使用: http://technet.microsoft.com/en-us/sysinternals/bb896645 但是您必须进行一些过滤才能单独查看 mxmlc 进程(在那里很容易)。就直接答案而言,我很想看到一个,但这些是现在的一些解决方法,可以看到更多幕后发生的事情。在同一主题上,但不一定与您目前的特定问题相关,如果您遇到奇怪的问题并需要一些好的调试工具,Charles 和 Wireshark 可以很好地捕捉网络流量的情况。

    我相信 swc 的编译可以更明确一些,如果您使用存档程序打开 swc,您可以查看 catalog.xml 并查看引用文件的列表,但我不确定这是如何在 IDE 或编译时使用的。 http://livedocs.adobe.com/flex/3/html/help.html?content=compilers_30.html 这里有一个参考,但深度不够。我编写了一个小型 Java 应用程序来进行提取和搜索某些特定类,以找出一个类最终是如何从旧的 sdk 进入我们的代码的,这绝对不好玩。

    肖恩

    【讨论】:

    • 我真的更希望在编译时知道/控制正在编译的内容,而不是事后,但感谢您的建议。此外,使用 COMPC,您可以使用 include-sources 选项显式列出要编译的 AS 文件,因此您可以控制以这种方式编译的内容。不幸的是,MXMLC 似乎没有可比的选择......
    • @Quinn 肯定能理解,希望你能得到更好的答案。
    • 好吧,在进行了更多搜索之后,因为这也困扰着我如果可能有某种方法可以追踪您正在寻找的信息...opensource.adobe.com/svn/opensource/flex/sdk/tags/…。我还有一些其他工作需要做,但肯定会在接下来的几天内检查。
    • 这里stopcoding.wordpress.com/2008/04/19/… 也写得很好,这使我首先搜索了编译器的源代码,并且可能无需深入研究所有源代码就可以回答您的问题。
    • 非常好的链接肖恩,谢谢。我认为这让我们走上了正确的道路。我将全面阅读那篇文章并扫描一些代码,看看它会把我们引向何方。谢谢!
    【解决方案3】:

    从我所看到的一切看来,在构建时捕获此信息的唯一方法似乎是编写您自己的调用 Flex 编译器类的 java 程序。实际上有几种不同的方法可以做到这一点,但我采用的方法是基于以下 pdf 第 10 页开始的报告示例:

    http://blogs.adobe.com/flexdoc/files/flexdoc/oem/oem_guide.pdf

    我感兴趣的只是构建的文件依赖关系,以便我可以将这些链接到版本控制中的源版本。因此,我省略了引用示例的定义、依赖项和先决条件部分。基本思路是构造一个flex2.tools.oem.Application对象,在上面运行“build”方法,然后使用getReport方法获取编译的所有血腥细节。这是我的解决方案代码的简化版本:

    File file = new File ("C:/MyFlexApp/main.mxml");
    File outputFile = new File("C:/MyFlexApp/bin/Foo.swf");
    Application application = new Application(file);
    application.setOutput(outputFile);            
    
    Configuration config = application.getDefaultConfiguration();
    File[] libFile = new File[] {new File("C:/MyFlexApp/bin/baz.swc")};
    config.addLibraryPath(libFile);
    
    application.setConfiguration(config);
    application.build(true);              
    
    report = application.getReport();
    
    
    Message[] m = report.getMessages();  
    if (m != null)
    {
        for (int i=0; i<m.length; i++) 
        {
            System.out.println(m[i].getLevel().toUpperCase() + 
                    " MESSAGE " + i + ": " + m[i]);
        }
    }
    // Lists the image files that are embedded.
    System.out.println("\n\nEMBEDDED ASSETS: ");
    String[] assetnames = report.getAssetNames(Report.COMPILER);
    if (assetnames != null)
    {
        for (int i=0; i<assetnames.length; i++) 
        {
            System.out.println(assetnames[i]);         
        }     
    }
    
    // Lists the libraries that are used.
    System.out.println("\nLIBRARIES: ");
    String[] compilerLibs = report.getLibraryNames(Report.COMPILER);
    if (compilerLibs != null)
    {
        for (int i=0; i<compilerLibs.length; i++) 
        {
            System.out.println(compilerLibs[i]);         
        }     
    }
    System.out.println("\nSOURCE NAMES: "); 
    String[] src = report.getSourceNames(Report.COMPILER);
    if (src != null)
    {
        for (int i=0; i<src.length; i++) {
            // Lists source files.
            System.out.println(src[i]);     
        }
    }
    

    感谢 Shaun 为我提供此解决方案的所有帮助。

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 2011-03-15
      相关资源
      最近更新 更多