如何确定MXMLC编译的文件

时间:2011-03-02 22:09:49

标签: flex compiler-construction mxmlc

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

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

当然,由于我没有很多关于Flex的经验,所以我可能会找到一个明显的答案。

由于

3 个答案:

答案 0 :(得分:7)

您应该在链接报告中找到您所追求的内容:

将此参数添加到编译器参数:

-link-report output.xml

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

答案 1 :(得分: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进入我们的代码,绝对不好玩。

肖恩

答案 2 :(得分:0)

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

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

所有我都知道是构建的文件依赖项,因此我可以将它们链接到版本控制中的源版本。为此,我省略了引用示例的Definitions,Dependencies和Prerequisites部分。基本思想是构造一个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所有帮助我的解决方案。