2010-11-25 11 views
3

Antを使用してFlex 4プロジェクトをコンパイルしようとしています。私はメインのアプリケーションをコンパイルすることができ、私はいくつかのモジュールをうまくコンパイルできます。サブパッケージに依存しているモジュールは、Error: Type was not found or was not a compile-time constantというエラーが発生しています。私はFlash Builder 4を使用してWindows上ですべての開発を行います。すべてをコンパイルすることができますが、コンパイルをヘッドレスLinuxベースのサーバー(Antが入っている場所)に移動するだけです。Antを使用したFlexモジュールのコンパイル

私は私の問題をテストするための簡単なプロジェクトを作成しました:

src-> Main.mxml 
|->modules 
     |-> module1-> Module1.mxml 
     |-> module2-> Module2.mxml 
       |-> subPackage-> SubClass.as 

Module1がモジュール2は、サブクラスのインスタンスを持っては授業他、その後のFlexフレームワーククラスを使用していません。メインアプリケーションのコンパイルは正常に動作し、Module1も正常に動作します。 Module2をコンパイルしようとすると、エラーError: Type was not found or was not a compile-time constant: SubClass.が出ます。

私の完全なAntスクリプトは次のとおりです。

<project name="Test" basedir="."> 

<property file="build.properties" /> 
<target name="properties"> 
    <fail unless="mxmlc">The "mxmlc" property must be set in build.properties.</fail> 
</target> 

<target name="build-app" depends="properties"> 
    <exec executable="${mxmlc}" dir="${src.dir}" failonerror="true"> 

     <!-- Point to the mxml file --> 
     <arg line="${app.name}.mxml" /> 

     <!-- Don\t generate debug swf --> 
     <arg line="-debug=false" /> 

     <!-- Generate optimized swf --> 
     <arg line="-optimize=true" /> 

     <!-- Don't build incrementally --> 
     <arg line="-incremental=false" /> 

     <!-- Place the built .swf file in the "bin" directory --> 
     <arg line="-output '${build.dir}/${app.name}.swf'" /> 

     <!-- 
      Create a linker report that lists all the classes already in the main app 
      This gets passed to the modules so that they don't load up the shared libs again. 
     --> 
     <arg line="-link-report='${temp.dir}/link-report.xml'"/> 

    </exec> 
</target> 

<target name="build-modules" description="Build Modules"> 
    <build.module dir="${module.dir}/module1" file="Module1"/> 
    <build.module dir="${module.dir}/module2" file="Module2"/> 
</target> 

<macrodef name="build.module"> 
    <attribute name="dir" /> 
    <attribute name="file" /> 
    <sequential> 
     <echo>@{file}</echo> 
     <exec executable="${mxmlc}" dir="${src.dir}" failonerror="true"> 
      <!-- Point to the mxml file --> 
      <arg line="'@{dir}/@{file}.mxml'" /> 

      <!-- Don't generate debug swf --> 
      <arg line="-debug=false" /> 

      <!-- Generate optimized swf --> 
      <arg line="-optimize=true" /> 

      <!-- Don't build incrementally --> 
      <arg line="-incremental=false" /> 

      <!-- Place the built .swf file in the "bin" directory --> 
      <arg line="-output '${module.build.dir}/@{file}.swf'" /> 

      <!-- Exclude all classes that are already in the main application --> 
      <arg line="-load-externs='${temp.dir}/link-report.xml'"/> 
     </exec> 
    </sequential> 
</macrodef> 

私はこれが動作しない理由として完全な損失でね。

おかげで、

--Ryan

+0

「サブパッケージ」とはどういう意味ですか?これらのクラスは、同じベースソースディレクトリにあるのでしょうか、それとも別のクラスになっていますか? –

+0

srcディレクトリには、 "module1"と "module2"という2つのディレクトリがあるという点で "modules"という1つのディレクトリがあります。 "module2"には "SubClass.as"クラスを含む "subPackage"というディレクトリがあります。言い換えれば、問題の3つのクラスは次のとおりです:modules.module1.Module1; modules.module2.Module2; modules.module2.subPackage.SubClass。 – Ryan

答えて

3

は多くの研究、試行錯誤とのろいの後、私は最終的に解決策を見つけました。もともと私はANTs <exec>コマンドを使ってモジュールをコンパイルしようとしていました。私の最終的な解決策では、ANT(フレックスSDKディレクトリant/lib/flexTasks.jarのflexTasks.jarから)の<mxmlc>ターゲットを使用するように変更しました。

<macrodef name="build.module"> 
    <attribute name="moduleDir" /> 
    <attribute name="dir" /> 
    <attribute name="file" /> 
    <sequential> 
     <echo>@{file}</echo> 
     <mxmlc file="@{moduleDir}/@{dir}/@{file}.mxml" 
       output='${module.build.dir}/@{dir}/@{file}.swf' 
       optimize="true" 
       debug="false" 
       load-externs="${temp.dir}/link-report.xml" 
       incremental="false" 
       fork="true" maxmemory="${maxMem}"> 
      <compiler.source-path path-element="${src.dir}"/> 
      <source-path path-element="${FLEX_HOME}/frameworks"/> 
      <compiler.library-path dir="${FLEX_HOME}/frameworks" append="true"> 
       <include name="libs" /> 
      </compiler.library-path> 
      <source-path path-element="${src.dir}"/> 
      <compiler.library-path dir="${libs.dir}/" append="true"> 
       <include name="*" /> 
      </compiler.library-path> 
     </mxmlc> 
    </sequential> 
</macrodef> 

この新しいマクロでは、いくつかのコンパイラオプションを追加しました。ソースパスとコンパイラライブラリのオプションを設定した後(コンパイラに何をリンクするかを指示する)、すべてがうまくいった。

+0

それは本当に素晴らしいです! – Luc

関連する問題