2

我已经阅读了有关 OpenLaszlo 的lzdeploy 工具的信息,但似乎只有很少的文档可用。

应该可以使用 Apache Ant 构建 OpenLaszlo DHTML 应用程序(例如,作为自动构建过程的一部分)。如何在 Ant 之外使用 lzc 和 lzdeploy 工具为 DHTML 运行时生成 OpenLaszlo 应用程序的编译版本,包括包装器页面?

4

1 回答 1

4

这是一个完整的 Ant 构建脚本,您可以将其与 OpenLaszlo 5.0 一起使用(尚未使用旧版本进行测试)。

<?xml version="1.0" encoding="UTF-8"?>
<project name="olApp" default="build" basedir=".">

  <description>Ant Build Script for OpenLaszlo DHTML App</description>

  <!-- OpenLaszlo canvas app filename -->
  <property name="app.file" value="testapp.lzx" />

  <!-- LPS home folder -->
  <property name="lps.home" value="PLEASE SET YOUR LPS_HOME FOLDER HERE!!!" />

  <!-- Build timestamp -->
  <property name="build.timestamp" value="will be the set through script below" />
  <script language="javascript">
    var date = new Date();
    var stamp = new java.text.SimpleDateFormat("yyyyMMdd-HHmmss").format(date);
    olApp.setProperty("build.timestamp", stamp);
  </script>

  <property name="project.folder" value="will be set through the script below" />
  <script language="javascript">
    var lpsHome = olApp.getProperty("lps.home"),
    basedir = olApp.getProperty("basedir"),
    fileSep = java.lang.System.getProperty("file.separator"),
    projectFolder = "app";
    olApp.setProperty("project.folder", projectFolder)
  </script>


  <!-- Default directories  -->
  <property name="lzx.dir" location="${basedir}/lzx" />
  <property name="build.dir" location="${basedir}/build" />
  <property name="temp.dir" location="${build.dir}/tmp" />
  <property name="release.dir" location="${basedir}/release" />

  <!-- CLASSPATH for Laszlo compiler lzc -->
  <path id="laszlo.compiler.classpath">
    <pathelement location="${lps.home}/WEB-INF/lps/server/build"/>
    <pathelement location="${lps.home}/WEB-INF/classes"/>
    <fileset dir="${lps.home}/WEB-INF/lib" includes="**/*.jar"/>
  </path>

  <target name="info"
          description="Dump useful configuration information before build">
    <echo message="Using LPS in ${lps.home}" />
    <echo message="Editor appl path relative to $LPS_HOME is  $LPS_HOME/${project.folder}" />
    <echo message="Timestamp for this build is ${build.timestamp} "/>
  </target>


  <target name="clean" depends="info"
          description="Delete all temporary and generated files and folders.">
    <!-- If the application file has been compiled using the
         browser developer console, remove all generate files. -->
    <script language="javascript">
      var file = olApp.getProperty("app.file");
      olApp.setProperty("masterSpriteFile", 
      file.substr(0,file.indexOf(".lzx")) + ".sprite.png");
    </script>
    <delete>
      <fileset dir="${lzx.dir}">
        <include name="**/*.sprite.png"/>
        <include name="**/*.swf10.swf"/>
        <include name="**/*.lzx.js"/>
      </fileset>
    </delete>
    <delete dir="${lzx.dir}/lps"/>
    <delete file="${lzx.dir}/${app.file}.js" />
    <delete file="${lzx.dir}/${app.file}.swf10.swf" />
    <delete file="${lzx.dir}/${masterSpriteFile}" />
    <echo message="Property app.file set to ${app.file}" />
    <delete dir="${build.dir}" />
    <delete dir="${release.dir}" />
  </target>

  <target name="init" depends="clean"
          description="Create all directories for the build process.">
    <mkdir dir="${temp.dir}" />
    <mkdir dir="${temp.dir}/lzxcompile" />
    <mkdir dir="${temp.dir}/lzdeploy" />
    <mkdir dir="${build.dir}" />
    <mkdir dir="${release.dir}" />
  </target>

  <target name="build" depends="init,compile-lzx"
          description="Compile Java and LZX source (SWF10 and DHTML), and copy the versions into the release folder.">
  </target>


  <!-- Copy LZX, JSP and other text files into folder ${temp.dir}.
       We don't want to pollute the source folder with files generated
       during compilation. -->
  <target name="copy-files-temp" depends="init">
    <echo message="Copying files from ${lzx.dir} to ${temp.dir}/lzxcompile" />
    <copy todir="${temp.dir}/lzxcompile">
      <fileset dir="${lzx.dir}" casesensitive="no">
        <!-- Include any file type here you want to package into the
             deployed application. -->
        <include name="**/*.lzx" />
        <include name="**/*.xml" />
        <include name="**/*.jsp" />
        <include name="**/*.html" />
        <include name="**/*.js" />
        <include name="**/*.css" />
        <include name="**/*.gif" />
        <include name="**/*.jpg" />
        <include name="**/*.mp3" />
        <include name="**/*.pdf" />
        <include name="**/*.png" />
        <include name="**/*.swf" />
        <include name="**/*.ttf" />
      </fileset>
    </copy>
  </target>

  <!-- Compile the LZX code for both the DHTML and SWF10 runtime -->
  <target name="compile-lzx" depends="init,copy-files-temp" >
    <echo message="Compiling LZX app for SWF10 and DHTML runtime (SOLO)"/>
    <script language="javascript">
      var lzxFile = olApp.getProperty("app.file");
      var timestamp = olApp.getProperty("build.timestamp");
      var fileNoending = lzxFile.substr(0,lzxFile.indexOf(".lzx"));
      olApp.setProperty("app.file.timestamp",
      fileNoending + "." + timestamp + ".lzx");
    </script>
    <move file="${temp.dir}/lzxcompile/${app.file}"
          tofile="${temp.dir}/lzxcompile/${app.file.timestamp}" />
    <!-- SWF10 with Laszlo Debugger enabled -->
    <antcall target="_solo-compile-file">
      <param name="file" value="${temp.dir}/lzxcompile/${app.file.timestamp}" />
      <param name="runtime" value="swf10" />
      <param name="debug" value="--debug"/>
      <param name="output" value="${temp.dir}/lzdeploy/swf10-debug.zip" />
    </antcall>
    <antcall target="_unzip-lzdeploy-package">
      <param name="output" value="${temp.dir}/lzdeploy/swf10-debug.zip" />
      <param name="targetFolder" value="${temp.dir}/lzdeploy/swf10-debug" />
    </antcall>
    <!-- FIX: lzdeploy bug workaround
         The SWF10 file is currently not added to the ZIP file, need to
         copy it over -->
    <copy file="${temp.dir}/lzxcompile/${app.file.timestamp}.swf10.swf"
          tofile="${temp.dir}/lzdeploy/swf10-debug/${app.file.timestamp}.swf10.swf" />

    <!-- DHTML with Laszlo Debugger enabled -->
    <antcall target="_solo-compile-file" >
      <param name="file" value="${temp.dir}/lzxcompile/${app.file.timestamp}" />
      <param name="runtime" value="dhtml" />
      <param name="debug" value="--debug"/>
      <param name="output" value="${temp.dir}/lzdeploy/dhtml-debug.zip" />
    </antcall>
    <antcall target="_unzip-lzdeploy-package">
      <param name="output" value="${temp.dir}/lzdeploy/dhtml-debug.zip" />
      <param name="targetFolder" value="${temp.dir}/lzdeploy/dhtml-debug" />
    </antcall>

    <!-- DHTML without Laszlo Debugger -->
    <antcall target="_solo-compile-file" >
      <param name="file" value="${temp.dir}/lzxcompile/${app.file.timestamp}" />
      <param name="runtime" value="dhtml" />
      <param name="output" value="${temp.dir}/lzdeploy/dhtml.zip" />
    </antcall>
    <antcall target="_unzip-lzdeploy-package">
      <param name="output" value="${temp.dir}/lzdeploy/dhtml.zip" />
      <param name="targetFolder" value="${temp.dir}/lzdeploy/dhtml" />
    </antcall>

    <!-- Copy the files for each app version - including dependencies - 
         into the release folder. -->
    <copy todir="${release.dir}/swf10-debug">
      <fileset dir="${temp.dir}/lzdeploy/swf10-debug/">
        <include name="**/*.*" />
      </fileset>
    </copy>
    <copy todir="${release.dir}/dhtml">
      <fileset dir="${temp.dir}/lzdeploy/dhtml/">
        <exclude name="${app.file.timestamp}.swf10.swf" />
        <include name="**/*.*" />
      </fileset>
    </copy>
    <copy todir="${release.dir}/dhtml-debug">
      <fileset dir="${temp.dir}/lzdeploy/dhtml-debug/">
        <exclude name="${app.file.timestamp}.swf10.swf" />
        <include name="**/*.*" />
      </fileset>
    </copy>
  </target>

  <!-- Compile the file and create the ZIP package with resources -->
  <target name="_solo-compile-file">
    <echo message="Creating application package for ${file}"/>
    <echo message="Using LPS_HOME: ${lps.home}"/>
    <echo message="args: --runtime=${runtime}  ${debug} --output ${output}"/>
    <java classpathref="laszlo.compiler.classpath"
          classname="org.openlaszlo.utils.DeployMain"
          fork="yes"
          failonerror="true">
      <jvmarg value="-Xmx1024M"/>
      <jvmarg value="-DLPS_HOME=${lps.home}"/>
      <arg line="--runtime=${runtime} --output ${output} ${debug} ${file}"/>
    </java>
  </target>

  <!-- Unzip the OpenLaszlo deployment ZIP file -->
  <target name="_unzip-lzdeploy-package">
    <echo message="Unzipping lzdeploy package ${output}" />
    <!--unzip src="${zip.target.file}" dest="${temp.zip.extracted}"-->
    <unzip src="${output}" dest="${targetFolder}">
      <patternset>
        <exclude name="widget-icon.png" />
        <exclude name="config.xml" />
        <!-- exclude name="index.html" /-->
        <exclude name="**/*.lzx" />
        <exclude name="**/*.css" />
      </patternset>
    </unzip>
  </target>

</project>

将构建脚本放入名为 testapp 的 $LPS_HOME(OpenLaszlo 服务器主目录)的子文件夹中。创建一个子目录 LZX,其中包含一个名为 testapp.lzx 的 OpenLaszlo 画布应用程序。我已将图像资源添加到子文件夹资源中,以测试资源是否正确打包到 SOLO 编译的应用程序文件夹中。

$LPS_HOME
└── testapp
    ├── build.xml
    └── lzx
        ├── resources
        │   └── Winnie-the-Pooh.jpg
        └── testapp.lzx

进入 $LPS_HOME,然后运行“ant build”。构建过程应该运行,并且您应该具有生成的文件夹结构:

testapp
├── build
│   └── tmp
│       ├── lzdeploy (more files)
│       └── lzxcompile (more files)
├── build.xml
├── lzx
│   ├── resources
│   │   └── Winnie-the-Pooh.jpg
│   └── testapp.lzx
└── release
    ├── dhtml
    │   ├── index.html
    │   ├── lps (more files)
    │   ├── resources
    │   │   └── Winnie-the-Pooh.jpg
    │   ├── testapp.20120810-125652.lzx.js
    │   └── testapp.20120810-125652.sprite.png
    ├── dhtml-debug
    │   ├── index.html
    │   ├── lps (more files)
    │   ├── resources
    │   │   └── Winnie-the-Pooh.jpg
    │   ├── testapp.20120810-125652.lzx.js
    │   └── testapp.20120810-125652.sprite.png
    └── swf10-debug
        ├── index.html
        └── lps (more files)

构建过程生成了三个版本的 OpenLaszlo 应用程序:带调试的 SWF、启用和不启用调试模式的 DHTML/HTML5。所有 JavaScript 和 SWF 文件都附有时间戳,这意味着不会从浏览器缓存中提取新版本的应用程序。如果将浏览器指向发布文件夹,单击三个文件夹中的任何一个(swf10-debug、dhtml、dhtml-debug)应该会打开 SOLO 编译的应用程序。

添加您自己的脚本以将版本上传到网络服务器,这应该不难。

于 2012-08-10T11:14:24.843 回答