Ant 混淆 + 压缩 + air包

1、Ant 合并js、css等

 

      系统安装python,通过python脚本实现web工程的html页面引用的js/css合并成一个文件(目的是减少html加载时的js/css请求链接数)

 

   #####################################################

   #### ################# html_merg.html #####################

  ######################################################

 

 

  #!/usr/bin/python
from BeautifulSoup import *
import os
import sys
import re

def extract_css(doc, doc_base, dirpath, node):
    if node.has_key('href'):
        node.extract()
        if node['href'].find('extjs') != - 1 or node['href'].find('common.js')!= - 1: //包含extjs字样的css不合并,并且common.js不合并
            add_style_node(doc, node['href'])
            return ""
        else:
            return get_content(doc_base, dirpath, node['href'])
    else:
        if len(node.contents) == 1:
           node.extract()
           return node.contents[0]
        else:
            return ""

def extract_js(doc, doc_base, dirpath, node):
    if node.has_key('src'):
        if node['src'].find('extjs') != - 1 or node['src'].find('publishTip.js')!= -1   ://包含extjs字样的js不合并,并且publishTip.js不合并
            node.extract()
            add_script_node(doc, node['src'])
            return ""
        else:
            if not node['src'].endswith('.js'):
                return
            node.extract()
            return get_content(doc_base, dirpath, node['src'])
    else:
          return "";
       # if len(node.contents) == 1:
       #     node.extract()
       #     return node.contents[0]
       # else:
       #     return ""


def get_content(doc_base, dirpath, path):
    try:
       
        if path.startswith('/'):       
            return open(doc_base + path).read()
        return open(os.path.join(dirpath , path)).read()
    except:
        print "/t/t Can not Read Content From File [%s%s]" % (doc_base, path)
        return ""

def write_content(path, content):
    file = open(path, "w")
    if isinstance(content, list):
        for line in content:
            if line:
                file.write(line)
                file.write("/n")
    else:
        file.write(content)
    file.close()
   
def flatten(doc_base, path, prefix):
    return ("%s_%s" % (prefix, path.replace(doc_base, ''))).replace('//', '_').replace('/', '_').replace('/.', '_')

def add_style_node(doc, href):
    style = Tag(doc, 'link')
    style['rel'] = "stylesheet"
    style['type'] = "text/css"
    style['href'] = href
    doc.head.insert(len(doc.html.head.contents), style)

def add_script_node(doc, href):
    script = Tag(doc, 'script')
    script['type'] = 'text/javascript'
    script['src'] = href
    doc.head.insert(len(doc.html.head.contents), script)

def handle_doc(doc_base, dirpath, file, prefix):
    print "Merging File [%s] " % os.path.join(dirpath, file)
   
    file_base_name = os.path.splitext(file)[0]
     
    # ignore all the files inside the WEB-INF folder
    if dirpath.find('WEB-INF') != - 1:
        return 
  
    content = open(os.path.join(dirpath, file)).read()
    doc = BeautifulSoup(content)
       
    if doc.html:
        flatten_name = flatten(doc_base, os.path.join(dirpath, file_base_name), prefix)
   
        # merge the css
        style_sheets = doc.findAll('link') + doc.findAll('style')
        css = [extract_css(doc, doc_base, dirpath, style_sheet) for style_sheet in style_sheets]
       
        if len(css) != 0:
            write_content('%s/css/%s.css' % (doc_base, flatten_name), css)
            add_style_node(doc, '/css/%s.css' % flatten_name)
                   
        
        # merge the js   
        scripts = doc.html.findAll('script')
      
        js = [extract_js(doc, doc_base, dirpath, script) for script in scripts]
       
        if len(js) != 0:
            write_content('%s/js/%s.js' % (doc_base, flatten_name), js)
        
             add_script_node(doc, '/js/%s.js' % flatten_name)   
           
       
        # update the file content only we have to merge js or css files
        if len(js) != 0 or len(css) != 0:
            content = str(doc)
#            print content
            write_content(os.path.join(dirpath, file), content)
       

if __name__ == "__main__":   
    doc_base = sys.argv[1]
    prefix = sys.argv[2]
    for dirpath, dirnames, filenames in os.walk(doc_base):
        for filename in filenames:
            if filename.endswith(".html"):
                try:
                    handle_doc(doc_base, dirpath, filename, prefix)
                except Exception, e:
                    print "Exception Occur When Handling %s" % filename
                    print "-=-=-=-"
                    print e
                    print "-=-=-=-"

 

   #####################################################

   #### ################# build.html #####################

  ######################################################

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="BaseAll" name="fair">
    <taskdef resource="jst-task.properties" classpath="lib/JSA.jar" /><!-- 混淆压缩需要 -->
    <!-- =================================================================== -->
    <!-- 清除所有文件-->
    <!-- =================================================================== -->
    <target name="cleanall">
        <delete dir="AntBuild" />
        <delete dir="release"/>
    </target>   
    <target name="init" >
        <property name="Name" value="fair" />
        <property name="name" value="fair" />
        <property name="version" value="0.1" />
        <property name="year" value="2009" />

        <echo message="----------- ${Name} ${version} [${year}] ------------" />
        <property name="debug" value="off" />
        <property name="optimize" value="on" />
        <property name="deprecation" value="on" />
        <property name="prefix" value="1.0"/>
               
        <!--    准备air文件路径 -->
        <property name="buildair.dest" value="AntBuild/build_air" />

        <!--    合并js/css脚本路径 -->
        <property name="js-css-merge.script" value="python/html_merge.py" /><!-- 合并依赖 -->
       

        <filter token="year" value="${year}" />
        <filter token="version" value="${version}" />
        <filter token="date" value="${TODAY}" />
        <filter token="log" value="true" />
        <filter token="verbose" value="true" />
    </target>

    <!-- =================================================================== -->
    <!-- 准备源文件-->
    <!-- =================================================================== -->
    <target name="prepare-src" >
        <!-- create directories -->       
        <mkdir dir="${buildair.dest}" />
        <mkdir dir="${release}"/>
        <!-- copy src files -->       
        <copy todir="${buildair.dest}">
            <fileset dir=".">
                <exclude name="python/**.*" />
                <exclude name="jaxer_bin/**.*" />
                <exclude name="AntBuild/**.*" />
                <exclude name="build.xml" />
                <exclude name="lib/adt.jar" />
                <exclude name="lib/JSA.jar" />
            </fileset>                   
        </copy>
    </target>
    <!-- =================================================================== -->
    <!-- js-css 合并-->
    <!-- =================================================================== -->
    <target name="js-css-merge" >
        <exec executable="python">
            <arg value="${js-css-merge.script}" />
            <arg value="${buildair.dest}" />
            <arg value="${prefix}" />
        </exec>
    </target>

    <!-- =================================================================== -->
    <!-- jsa压缩js文件-->
    <!-- =================================================================== -->
    <target name="jscompress" >     
        <!--    准备air文件路径 -->
        <property name="buildair.dest" value="AntBuild/build_air" />
       
        <jscompress destDir="${buildair.dest}" charset="utf-8" syntaxcompression="true" textcompression="true" compatible="true">
            <fileset dir="${buildair.dest}">
                <include name="js/**.js" />               
            </fileset>
        </jscompress>
    </target>   
    <!-- =================================================================== -->
    <!--  打air包-->
    <!-- =================================================================== -->     
     <!-- Project properties -->
    
     <property name="ADT.JAR" value="lib/adt.jar" /> <!-- air包依赖 -->
     <property name="KEYSTORE" value="C:/test.p12" /><!-- 证书 -->
     <property name="STORE_PASS" value="123456" /> 
 
   

    <property name="APP_ROOT_DIR" value="AntBuild/build_air"/>  
    <property name="APP_DESCRIPTOR" value="AntBuild/build_air/application.xml"/>
    <property name="AIR_NAME" value="web.air"/>
    <property name="release"  location="release"/>
    <property name="assets"  location="AntBuild/build_air"/>
    <property name="STORETYPE" value="pkcs12"/>

   
 
    <target name="package2air" >
        <echo>---- packageing .... --- </echo>
        <java jar="${ADT.JAR}" fork="true" failοnerrοr="true">
            <arg value="-package"/>
            <arg value="-storetype"/>
            <arg value="${STORETYPE}"/>
            <arg value="-keystore"/>
            <arg value="${KEYSTORE}"/>
            <arg value="-storepass" />
            <arg value="${STORE_PASS}" />            
            <arg value="${release}/${AIR_NAME}"/>
            <arg value="${APP_DESCRIPTOR}"/>
            <arg value="-C"/>
            <arg value="${APP_ROOT_DIR}"/>
            <arg value="${assets}"/>
        </java>
        <echo>---- packaged .... --- </echo>
    </target>
   
    <!-- =================================================================== -->
    <!-- ant 启动顺序-->
    <!-- =================================================================== -->
    <target name="BaseAll" depends="cleanall,init,prepare-src,js-css-merge,jscompress,package2air"/>
</project>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值