2011-03-02 63 views
1

我需要一種以編程方式記錄MXMLC編譯中消耗哪些源文件的方法。理想情況下,會有一個標誌傳遞給MXMLC,讓它報告正在編譯的源文件的完整列表,但似乎沒有這樣的標誌。看起來你通常只​​需將一個main.mxml文件傳遞給MXMLC,它就會關閉並編譯所需的所有內容,而不會告訴你它在做什麼。據我所知,你也不能明確列出要編譯的文件;它會自動解析引用並編譯引用的源代碼,而無法控制該行爲或對其進行報告。如何確定MXMLC編譯的文件

如果編譯器無法提供此信息並且用戶無法控制此行爲,我唯一能想到的其他選擇是爲MXML編寫自己的源代碼掃描器,該掃描器將遍歷代碼樹中的所有引用以提供報告的MXMLC 應該正在編譯,雖然這顯然是容易出錯,當然不是我期待的。

當然,由於我沒有太多的Flex經驗,可能有一個明顯的答案,我錯過了。

感謝

回答

7

你會發現你的鏈接報告後什麼:

這個PARAM添加到您的編譯參數:

-link-report output.xml 

它給你的信息噸,因此也有一個handy AIR tool爲解析結果。

+0

好吧,我現在感覺有點傻了,我自己花費了所有的努力編寫解決方案(再加上查看編譯器文檔幾個小時)。我仍然有點像我的解決方案,因爲它具有我需要的信息,沒有別的東西需要排序。但是,對於一般目的而言,這確實是最好的答案。謝謝! – 2011-03-08 02:02:58

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

我真的很想知道/控制編譯時正在編譯什麼,而不是事後,但感謝您的建議。此外,使用COMPC,您可以使用include-sources選項明確列出要編譯的AS文件,以便您可以控制正在編譯的內容。不幸的是,似乎沒有MXMLC的可比選項... – 2011-03-02 23:22:11

+0

@Quinn絕對可以理解,希望你能得到更好的答案。 – shaunhusain 2011-03-02 23:39:34

+0

好了之後做了一些更多的搜索,因爲這也困擾了我,我想我找到了mxmlc的來源,如果編譯和本地調試應該能夠得到一個關於這一切如何工作的答案,如果有可能的某種方式來讓它找出您尋找的信息... http://opensource.adobe.com/svn/opensource/flex/sdk/tags/4.0.0.7219_flex4_beta1/modules/compiler/src/java/flex2/tools/ Mxmlc.java。我還需要做其他一些工作,但在接下來的幾天裏肯定會檢查一下。 – shaunhusain 2011-03-03 01:29:32

0

從我看着一切,似乎只有這樣才能捕捉在構建時此信息來編寫調用Flex編譯器類自己的Java程序。實際上有幾種不同的方式來做到這一點,但我去的方法以起始以下PDF 10頁的報告,例如:

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

所有我想知道是文件構建的依賴關係,這樣我就可以將它們鏈接到版本控制中的源代碼版本。爲此,我省略了引用示例的定義,依賴關係和先決條件部分。其基本思想是構建一個flex2.tools.oem.Application對象,對其運行「構建」方法,然後使用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]);  
    } 
} 

感謝肖恩爲所有使我這個解決方案的幫助。

相關問題