1

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

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

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

谢谢

4

3 回答 3

7

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

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

-link-report output.xml

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

于 2011-03-08T01:01:31.777 回答
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 进入我们的代码的,这绝对不好玩。

肖恩

于 2011-03-02T22:45:41.553 回答
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 为我提供了这个解决方案的所有帮助。

于 2011-03-07T23:57:44.427 回答