如何确定MXMLC编译哪些文件

问题描述 投票:0回答:3

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

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

当然,由于我没有太多使用 Flex 的经验,因此我可能缺少一个明显的答案。

apache-flex mxmlc
3个回答
7
投票

您应该在链接报告中找到您想要的内容:

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

-link-report output.xml

它为您提供了大量信息,因此还有一个方便的 AIR 工具用于解析结果。


0
投票

我实际上不知道并且想知道一种方法来通过命令行执行您所说的操作,那就太好了。 但如果没有能力这样做,我相信你可以使用反编译器来检查你的 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 进入我们的代码,这绝对不好玩。

肖恩


0
投票

从我所看到的一切来看,在构建时捕获此信息的唯一方法似乎是编写自己的调用 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 为我提供的所有帮助,让我找到了这个解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.