Как мне воспроизвести функциональность инструмента выпуска Flash Builder в ant? - PullRequest
3 голосов
/ 17 сентября 2009

Я хочу создать ant-скрипт, который выполняет те же действия по компиляции в проекте Flash Builder 4 (Gumbo), что и пункт меню Project->Export Release Build.... Мой муравей довольно сильный, это не проблема, но я не совсем уверен, что именно делает эта запись.

Некоторые детали:

  • Я буду использовать 3.x SDK (скажем, 3.2 для удобства).
  • Я буду строить на Mac, и я могу с радостью использовать муравей, марку или какой-нибудь странный скрипт, если вы так катаетесь.
  • Любые полезные оптимизации, которые вы можете предложить, будут приветствоваться.
  • Проект содержит несколько ресурсов, MXML и источник ActionScript, а также пару .swcs, встроенных в проект (не RSL'd)

Может ли кто-нибудь предоставить файл ant build.xml или makefle, который они используют для создания файла выпуска .swf из аналогичного проекта Flex?

Ответы [ 3 ]

2 голосов
/ 09 декабря 2009

Один быстрый способ узнать параметры компилятора - добавить этот тег в параметры вашего компилятора:

-dump-config your / drive / to / store / the / xmlfile.xml

Это выведет все параметры компилятора муравья, и вы сможете скопировать части, которые хотите сохранить.

1 голос
/ 14 апреля 2010

Демон компилятора HellFire (http://bytecode -workshop.com /) может генерировать build.xml непосредственно из вызовов компилятора, выполняемых Flex / Flash Builder. Это означает, что ваш скрипт ant создает SWC и SWF на основе того же набора параметров компилятора, который вы установили в Flex / Flash Builder.

Кроме того, проверьте этот блог:

http://stopcoding.wordpress.com/2010/01/15/ant-tasks-for-hfcd-now-available-2/

0 голосов
/ 18 сентября 2009

Некоторое время назад у меня были некоторые проблемы с задачами Adobe Flex Ant, поэтому я в итоге использовал exec-вызов к компилятору mxmlc с множеством опций, и мы только что основались на этом. Есть несколько ноющих сомнений, что то, что я делаю с build.xml, не совсем то, что делает FB3 (то, что у нас есть), но этого может быть достаточно, чтобы помочь вам начать ... вы говорите, что ваш ant-fu разумный сильный, поэтому я пропущу большую часть моего файла сборки и позволю вам собрать воедино кусочки.

<!--flex stuff-->
<property name="dir.flex.sdk"                 value="${system.build.flex.sdk}"/>
<property name="dir.flex.home"                value="${dir.abc}/flex/sdks/${dir.flex.sdk}"/>
<property name="dir.flex.projects"            value="${dir.abcd_plat}/webapp/flexprojects/"/>
<property name="dir.modules"                  value="${dir.war}/modules/"/>
<property name="FLEX_HOME"                    value="${dir.flex.home}"/>
<property name="APP_ROOT"                     value="${dir.war}"/>
<property name="flexc.exe"                    value="This should be set in the build-${os.family}.xml file"/>
<property name="asdoc.exe"                    value="This should be set in the build-${os.family}.xml file"/>
<property name="optimizer.exe"                value="This should be set in the build-${os.family}.xml file"/>
<property name="flex.mxmlc"                   value="${dir.flex.home}/bin/${flexc.exe}"/>
<property name="flex.compc"                   value="${dir.flex.home}/bin/${compc.exe}"/>
<property name="flex.asdoc"                   value="${dir.flex.home}/bin/${asdoc.exe}"/>
<property name="flex.optimizer"               value="${dir.flex.home}/bin/${optimizer.exe}"/>
<property name="flex.options.warnings"        value="false"/>
<!--options that are used in common for compiling all .swc and .swf files-->
<property name="flex.meta.1"                  value="-creator 'MyCorp.' -publisher 'MyCorp.'"/>
<property name="flex.meta.2"                  value="-title MegaProduct -description http://ourURL.com"/>
<property name="flex.meta.props"              value="${flex.meta.1} ${flex.meta.2}"/>
<property name="debug.options"                value="-optimize=true -debug=false"/>
<property name="common.flex"                  value="-as3 -target-player=9.0.124 -warnings=${flex.options.warnings}"/>
<property name="license.flex3"                value="(put your own here)"/>
<property name="common.fixed"                 value="-license=flexbuilder3,${license.flex3} -sp ${dir.war} -library-path+=${dir.webinf}/lib"/>
<property name="flex.common.args"             value="${flex.meta.props} ${debug.options} ${common.flex} ${common.fixed}"/>
<!--this is currently unused, but if we make a debug version, this can be set to make a separate output file-->
<property name="swf.suffix"                   value=""/>

<!--=================================================================================
    MACRODEFs
-->
<!--this is used to extract .swf files from 3rd party .swc libraries, in order to do dynamic linking-->
<macrodef name="extract-flex-lib" description="For modularizing flex compilation">
    <attribute name="swc-lib" default="NOT SET"/>

    <sequential>
        <!--use a copy task - it can get the file out of the zip, and rename it at the same time-->
        <copy todir="${dir.war}" preservelastmodified="true">
            <zipfileset src="${dir.webinf}/lib/@{swc-lib}.swc">
                <patternset>
                    <include name="library.swf"/>
                </patternset>
            </zipfileset>
            <mapper type="glob" from="library.swf" to="@{swc-lib}-debug.swf"/>
        </copy>
        <!--run the flex optimizer on the extracted .swf - note the as3 metadata that's kept, it's required-->
        <exec executable="${flex.optimizer}" failonerror="true">
            <arg line="-keep-as3-metadata='Bindable,Managed,ChangeEvent,NonCommittingChangeEvent,Transient'"/>
            <arg line="-input @{swc-lib}-debug.swf -output @{swc-lib}.swf"/>
        </exec>
        <!--delete the unoptimzed swf, don't need it anymore-->
        <delete file="@{swc-lib}-debug.swf"/>
    </sequential>
</macrodef>

<!--this is used to compile our internal flex modules-->
<macrodef name="flexc-mxml" description="For building the flex modules during flex compilation">
    <attribute name="name"        default=""/>
    <attribute name="mxml.args"   default="${flex.common.args} ${module.args}"/>
    <attribute name="sourcePath"  default=""/>
    <attribute name="destPath"    default=""/>

    <sequential>
        <echo message="  Compiling with mxmlc: @{name}"/>
        <exec executable="${flex.mxmlc}" failonerror="true">
            <arg line="@{mxml.args} @{sourcePath} -output @{destPath}"/>
        </exec>
    </sequential>
</macrodef>

<!--this is used to compile our subprojects under abcd_plat/webapp/flexprojects-->
<macrodef name="flexc-subproject" description="For compiling the flex subprojects into .swc files">
    <attribute name="name"        default=""/>
    <attribute name="xtra.args"   default=""/>

    <sequential>
        <echo/>
        <echo message=" Compiling subproject: @{name}"/>
        <xslt in="${dir.flex.projects}/@{name}/.flexLibProperties" out="${dir.flex.projects}/@{name}/src/manifest.xml" style="${dir.war}/build-manifest-style.xsl"/>
        <exec executable="${flex.compc}" failonerror="true">
            <arg line="-load-config+=${dir.flex.projects}/@{name}/include-files.xml"/>
            <arg line="-namespace http://@{name}.ourURL.com ${dir.flex.projects}/@{name}/src/manifest.xml"/>
            <arg line="-include-namespaces http://@{name}.ourURL.com @{xtra.args}"/>
            <arg line="-library-path+=${dir.webinf}/lib -sp ${dir.flex.projects}/@{name}/src -output ${dir.webinf}/lib/@{name}.swc"/>
        </exec>
    </sequential>
</macrodef>


<!--=================================================================================
    This is where all the compilation is done.  The actual work is split among
    several different tasks in order to organize them better.

    This target uses the html-wrapper task defined in flexTasks.jar - see taskdef above.
-->
<target name="flexcompile" depends="flexc-modularize" description="Builds the Flex sources" unless="flexc.notRequired.main">
    <echo message="Compiling MegaProduct Flex application on OS family: ${os.family}"/>
    <echo message="   mxmlc is: ${flex.mxmlc}"/>
    <echo message="   compc is: ${flex.compc}"/>

    <!--compile flex sub-projects first (main application depends on these extra libraries)-->
    <antcall target="flexc-projects"/>

    <!--compile the main MegaProduct application-->
    <antcall target="flexc-main"/>

    <!--compile the foobar stuff, which link against the main app.  these foorbars are modules
     inside a subproject, so they are handled differently from other flex projects and modules-->
    <antcall target="flexc-foorbars"/>

    <!--generate the html wrapper for the .swf-->
    <html-wrapper title="MyCorp MegaProduct" application="app_name" swf="app_name" history="false" template="express-installation"/>
</target>

<target name="flexc-projects">
    <!--the name must match the name of the folder exactly, also they are not in parallel as some depend on others-->
    <flexc-subproject name="Dockable"/>
    <flexc-subproject name="EXRibbon" xtra.args="-source-path+=${dir.flex.projects}/EXRibbon/locale/en_US/"/>
    <!--note: MPLib does some extra stuff with the image dir in order to link against images correctly-->
    <copy todir="${dir.flex.projects}/MPLib/src/image"><fileset dir="${dir.war}/image"/></copy>
    <flexc-subproject name="MPLib"/>
    <delete dir="${dir.flex.projects}/MPLib/src/image"/>
</target>

<target name="flexc-main">
    <!--the link report is used to create the symbols in the main swf, and modules link against it-->
    <property name="link.report"   value="${dir.war}/abc_link_report.xml"/>

    <!--modular.args is set in flexc-modularize.  If not set, this sets it to an empty property-->
    <property name="modular.args"  value=""/>

    <!--set up options specific for the main part and for the modules-->
    <property name="main.args"     value="-link-report=${link.report} ${modular.args}"/>
    <property name="module.args"   value="-load-externs=${link.report}"/>

    <!--compile abc_flex.mxml here-->
    <echo message="Compiling abc_flex application, sub-applications and modules..."/>
    <echo/>
    <flexc-mxml name="abc_flex" mxml.args="${flex.common.args} ${main.args}"
            sourcePath="${dir.war}/abc_flex.mxml" destPath="${dir.war}/abc_flex${swf.suffix}.swf"/>

    <!--compile MPMainSubApplication.mxml sub-application here-->
    <flexc-mxml name="MPMainSubApplication" mxml.args="${flex.common.args} ${main.args}"
            sourcePath="${dir.war}/MPMainSubApplication.mxml" destPath="${dir.war}/MPMainSubApplication.swf"/>

    <!--compile internal modules next - just add new modules to the list here -->
    <parallel>   <!--do in parallel - it goes faster and they don't depend on each other-->
        <property name="dir.module.src" value="${dir.war}/module/"/>
        <flexc-mxml name="module1"      sourcePath="${dir.module.src}/editor/Editor.mxml"          destPath="${dir.module.src}/editor/Editor.swf"          />
        <flexc-mxml name="RunModule"   sourcePath="${dir.module.src}/run/RunModule.mxml"          destPath="${dir.module.src}/run/RunModule.swf"          />
        <!--<flexc-mxml name="JobManager"  sourcePath="${dir.module.src}/jobmanager/JobManager.mxml"  destPath="${dir.module.src}/jobmanager/JobManager.swf"  />-->
        <flexc-mxml name="Editor2"        sourcePath="${dir.module.src}/edit/Editor.mxml"                destPath="${dir.module.src}/edit/Editor.swf"                />
    </parallel>
</target>

ПРИМЕЧАНИЯ:

Я не уверен, является ли это хорошей идеей или нет, но мы просто помещаем файлы .swc для включения в наши библиотеки среднего уровня Java в WEB-INF / lib, поэтому всякий раз, когда мы добавляем новый flex lib в систему управления исходным кодом мы просто бросаем это туда. Компиляция выполняется в макросах, и большинство параметров определяются как свойства в верхнем разделе. Цели делят работу, потому что наше приложение довольно большое; Вы, вероятно, не нуждаетесь в них, но это пример работы модулей в подпроектах плюс отчет о ссылках, и он следует тому, как ссылки на подпроект из основного приложения (я думаю). Наша сборочная машина - linux, поэтому свойство flexc.exe (и другие) определяется таким образом - оно устанавливается во время выполнения. Имена для этого ответа были разобраны вручную, поэтому, пожалуйста, перепроверьте наличие опечаток, если вы что-нибудь вырезали.

Кроме того, инкрементная компиляция фактически не используется; похоже глючит. То же самое касается модуляризации, поэтому я не включил эту цель.

Я построил все это сам, поэтому я горжусь этим, но если есть что-то, что выглядит ненадежно или плохо пахнет, пожалуйста, дайте мне знать. Спасибо!

...