Как определить, какие файлы MXMLC компилирует - PullRequest
1 голос
/ 03 марта 2011

Мне нужен способ программно записывать, какие исходные файлы используются в компиляции MXMLC. В идеале должен быть флаг, который нужно передать MXMLC, чтобы он сообщал полный список исходных файлов, которые он компилирует, но такого флага, похоже, нет. Обычно кажется, что вы просто передаете файл main.mxml в MXMLC, и он уходит и компилирует все, что ему нужно, не сообщая вам, что он делает. Насколько я могу судить, вы также не можете явно перечислить файлы для его компиляции; он автоматически разрешит ссылки и скомпилирует ссылочные источники без какого-либо способа управления этим поведением или создания отчетов по нему.

Если компилятор не может предоставить эту информацию, а пользователь не может управлять этим поведением, единственная другая опция, о которой я могу подумать, - это написать собственный сканер исходного кода для MXML, который будет проходить по всем ссылкам в дереве кода, чтобы получить отчет о что MXMLC должен компилировать, хотя это, очевидно, подвержено ошибкам и, конечно, не то, чего я жду.

Конечно, поскольку у меня нет большого опыта работы с Flex, может быть очевидный ответ, который я упускаю.

Спасибо

Ответы [ 3 ]

7 голосов
/ 08 марта 2011

Вы должны найти то, что вы ищете в отчете о ссылках:

Добавьте этот параметр к аргументам компилятора:

-link-report output.xml

Он дает вам тонну информации, так что есть также удобный инструмент AIR для анализа результатов.

0 голосов
/ 08 марта 2011

Из всего, на что я смотрел, казалось, что единственный способ собрать эту информацию во время сборки - это написать собственную Java-программу, которая вызывает классы компилятора Flex.На самом деле есть несколько разных способов сделать это, но метод, который я использовал, был основан на примере отчета, начиная со страницы 10 следующего PDF:

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]);     
    }
}

Спасибо Шону за всю помощь, которая привела меня к этому решению.

0 голосов
/ 03 марта 2011

Я на самом деле не знаю и хотел бы знать, как сделать то, что вы говорите, через командную строку, это было бы здорово. Но без возможности сделать это, я полагаю, вы могли бы использовать декомпилятор для проверки вашего SWF-файла, что-то вроде Trillix, я уверен, покажет вам все классы, в которые были скомпилированы (откуда они были решены, это другая история). Чтобы увидеть, какие файлы доступны, вы можете (если вы используете Windows) использовать: http://technet.microsoft.com/en-us/sysinternals/bb896645 но вам придется выполнить некоторую фильтрацию, чтобы увидеть только процесс mxmlc (там довольно легко). Поскольку в качестве прямого ответа я бы хотел увидеть его, но на данный момент это несколько обходных путей, чтобы увидеть немного больше того, что происходит под капотом. На ту же тему, но не обязательно связанную с вашей конкретной проблемой прямо сейчас, Чарльз и Wireshark хороши для того, чтобы захватить много о том, что происходит с сетевым трафиком, если у вас возникают странные проблемы и вам нужны хорошие инструменты отладки.

Я верю, что при компиляции SWC вы можете быть немного более явным, и если вы откроете SWC с помощью архивной программы, вы можете посмотреть в catalog.xml и увидеть список файлов, на которые есть ссылки, но я точно не уверен как это используется в IDE или во время компиляции. Здесь есть ссылка http://livedocs.adobe.com/flex/3/html/help.html?content=compilers_30.html, но не очень много глубины. Я написал небольшое Java-приложение для извлечения и поиска какого-то определенного класса, чтобы выяснить, каким образом класс в конечном итоге попадает в наш код из старого SDK, определенно не весело.

Shaun

...