1.lib.yml dir: lib compile-classpath: [ xmlrpc, json, msnm, ant, spring, spring-aspects, acegi, hibernate, aspectj, dom4j, dwr, freemarker, jakarta-commons, jakarta-log4j, jakarta-taglibs, openid, memcached, metadata-extractor, pinyin4j, quartz, servletapi, sitemesh, webwork, google, ehcache, javamail, jmagick, slf4j, painiu-common, painiu-ypfs, captcha ] js-compression-classpath: [yui-tools] deploy-classpath: [ spring, spring-aspects, hibernate, jta, webwork, acegi, javamail, ant, aspectj, jakarta-commons, jakarta-log4j, jakarta-taglibs, dom4j, dwr, freemarker, google, metadata-extractor, memcached, pinyin4j, quartz, oscache, sitemesh, velocity, xmlrpc, xerces, json, msnm, openid, slf4j, painiu-events, painiu-common, painiu-ypfs, captcha ] painiu-common: dir: painiu jar: painiu-common-0.7.jar painiu-ypfs: dir: painiu jar: ypfs-0.2.jar painiu-tools: dir: painiu jar: painiu-tools-0.2.jar painiu-events: dir: painiu jar: painiu_events.jar jmagick: dir: painiu jar: jmagick.jar json: dir: painiu jar: json.jar msnm: dir: painiu jar: msnm.jar xmlrpc: dir: painiu jar: xmlrpc-2.0.jar rhino: dir: painiu jar: custom_rhino.jar ant: dir: ant-1.6.5 jar: ant.jar spring: dir: spring-2.0.1 jar: spring.jar spring-aspects: dir: spring-2.0.1 jar: spring-aspects.jar acegi: require: [spring] dir: spring-2.0.1 jar: acegi-security-1.0.3.jar hibernate: require: [asm, antlr, c3p0, cglib] dir: hibernate-3.1 jar: hibernate3.jar jta: dir: hibernate-3.1 jar: jta.jar ehcache: dir: ehcache-1.2.3 jar: ehcache-1.2.3.jar c3p0: dir: hibernate-3.1 jar: c3p0-0.9.0.jar cglib: dir: cglib-2.1_3 jar: cglib-nodep-2.1_3.jar asm: dir: asm-2.2.2 jar: [asm-2.2.2.jar, asm-commons-2.2.2.jar, asm-util-2.2.2.jar] antlr: dir: antlr jar: antlr-2.7.6.jar aspectj: dir: aspectJ-5 jar: [aspectjrt.jar, aspectjweaver.jar] dom4j: dir: dom4j-1.6.1 jar: dom4j-1.6.1.jar dwr: dir: dwr-1.1.beta3 jar: dwr.jar freemarker: dir: freemarker-2.3.6 jar: freemarker.jar google: dir: google jar: [g4j-0.3.19.jar, gdata-client-1.0.jar] jakarta-commons: dir: jakarta-commons jar: [commons-beanutils.jar, commons-codec.jar, commons-collections.jar, commons-configuration.jar, commons-digester.jar, commons-fileupload.jar, commons-httpclient-3.0.jar, commons-io.jar, commons-lang.jar, commons-logging.jar, jakarta-oro.jar] jakarta-log4j: dir: jakarta-log4j-1.2.9 jar: log4j-1.2.9.jar jakarta-taglibs: dir: jakarta-taglibs jar: [jstl.jar, standard.jar] openid: dir: janrain-openid-2006-07-04 jar: [janrain.jar, libidn-0.6.3.jar] memcached: dir: java_memcached jar: java_memcached-release_1.5.1.jar javamail: dir: javamail-1.3.1 jar: [mail.jar, activation.jar] metadata-extractor: dir: metadata-extractor-2.3.1 jar: metadata-extractor-2.3.1.jar oscache: dir: oscache-2.2 jar: oscache-2.2.jar pinyin4j: dir: pinyin4j-2.0.0 jar: pinyin4j-2.0.0.jar quartz: dir: quartz-1.6.0 jar: quartz-1.6.0.jar servletapi: dir: servletapi-2.3 jar: servletapi-2.3.jar sitemesh: dir: sitemesh-2.2.1 jar: sitemesh-2.2.1.jar velocity: dir: velocity-1.4 jar: velocity-1.4.jar webwork: dir: webwork-2.2.2 jar: [ognl.jar, oscore.jar, rife-continuations.jar, xwork.jar, webwork-2.2.2.jar] xerces: dir: xerces-2.8.0 jar: [resolver.jar, xercesImpl.jar, xml-apis.jar] taobao: dir: taobao jar: alisoft-aep-sip-sdk-isv-1.0.jar slf4j: dir: slf4j-1.4.3 jar: [slf4j-api-1.4.3.jar, slf4j-log4j12-1.4.3.jar] captcha: dir: captcha jar: kaptcha-2.3.jar yui-tools: dir: yui-compressor-2.4.2 jar: yuicompressor-2.4.2.jar 2.Rakefile require 'rake' require 'yaml' # Common Variables --------------------------------------------------------------- PATH_SEP = ":" BASE_DIR = File.dirname(__FILE__) APP_NAME = "mingda" APP_VERSION = "1.0.0" APP_JAR = "#{APP_NAME}/mall365-#{APP_VERSION}.jar" SRC_DIR = "src" JAVA_SRC_DIR = "#{SRC_DIR}" LIB_DIR = "lib" BUILD_DIR = "build" DEST_DIR = "dest" COMPILE_PARAMS = %w( -g:none -1.6 -encoding UTF-8 -progress ).join(' ') COMPILE_DEST_DIR = "#{BUILD_DIR}/app/WEB-INF/classes" # Classpath --------------------------------------------------------------------- LIB = YAML.load(File.open('lib/lib.yml')) def build_classpath(classpath, *libs) libs.flatten! libs.each do |l| jar = LIB[l]['jar'] jar = [jar] unless jar.class == Array jar.each do |j| path = File.join(LIB['dir'], LIB[l]['dir'], j) classpath << PATH_SEP << path unless classpath.include? path end # add requirements build_classpath(classpath, LIB[l]['require']) if LIB[l]['require'] end classpath end def collect_app_jars(jars, *libs) libs.flatten! libs.each do |l| jar = LIB[l]['jar'] jar = [jar] unless jar.class == Array jar.each do |j| path = File.join(LIB['dir'], LIB[l]['dir'], j) jars << path unless jars.include? path end # add requirements collect_app_jars(jars, LIB[l]['require']) if LIB[l]['require'] end jars end COMPILE_CLASSPATH = build_classpath("", LIB['compile-classpath']) JS_COMPRESSION_CLASSPATH = build_classpath("", LIB['js-compression-classpath']) # Make directory structure ------------------------------------------------------ DIRS = [DEST_DIR, BUILD_DIR, "#{BUILD_DIR}/web", "#{BUILD_DIR}/app", "#{BUILD_DIR}/app/WEB-INF"] desc "Make the directory structure for building" task :make_dir_structure do DIRS.each { |dir| mkdir_p dir } end # Task clean ------------------------------------------------------------------- CLEAN = FileList[DEST_DIR, BUILD_DIR] desc "Remove any temporary products." task :clean do CLEAN.each { |fn| rm_rf fn rescue nil } end # Package Web files ----------------------------------------------------------- WEB_FILES = FileList[ 'web/images/**/*', 'web/**/*.html', 'web/**/*.htm', 'web/**/*.css', 'web/**/*.htc', 'web/**/*.gif', 'web/**/*.jpg', 'web/**/*.jbf', 'web/**/*.png', 'web/**/*.swf', 'web/**/*.zip', 'web/favicon.ico', 'web/crossdomain.xml' ].exclude('*.jsp', 'web/WEB-INF') desc "Copy static web files..." task :copy_web_files do WEB_FILES.each do |f| cp_file f, "#{BUILD_DIR}/#{f}" end end def cp_file!(src, dest) if File.file? src mkdirs_if_not_exists dest cp src, dest end end def cp_file(src, dest) if File.file? src if not File.exists?(dest) or File.new(src).mtime > File.new(dest).mtime mkdirs_if_not_exists dest cp src, dest end end end def mkdirs_if_not_exists(file) non_exists_dirs = [] dir = File.dirname(file) while not File.exists?(dir) non_exists_dirs << dir dir = File.dirname(dir) end if not non_exists_dirs.empty? non_exists_dirs.reverse!.each { |d| mkdir d } end end JS_COMPRESS_EXCLUDE_FILES = FileList[ 'web/scripts/common.js', 'web/scripts/lightedit.js', 'web/scripts/photo_upload.js', 'web/scripts/tinymce/**/*.js', 'web/**/lang*.js', 'web/**/getcity.js' ] JS_FILES = FileList[ 'web/**/*.js' ].exclude( ) JS_RENAME_DICT = { } CSS_COMPRESS_EXCLUDE_FILES = FileList[ # 'web/scripts/common.js', # 'web/scripts/lightedit.js', # 'web/scripts/photo_upload.js', # 'web/scripts/tinymce/**/*.js', # 'web/**/lang*.js', # 'web/**/getcity.js' ] CSS_FILES = FileList[ 'web/styles/*.css' ].exclude( ) CSS_RENAME_DICT = { } desc "Compress javascript source files" task :compress_js_files do excludes = JS_COMPRESS_EXCLUDE_FILES.to_a JS_FILES.each do |js| if excludes.include?(js) if JS_RENAME_DICT[js] cp_file js, "#{BUILD_DIR}/#{JS_RENAME_DICT[js]}" else cp_file js, "#{BUILD_DIR}/#{js}" end else # use java to compress js if JS_RENAME_DICT[js] compress_js js, JS_RENAME_DICT[js] else compress_js js, js end end end end desc "Compress css source files" task :compress_css_files do excludes = CSS_COMPRESS_EXCLUDE_FILES.to_a CSS_FILES.each do |css| if excludes.include?(css) if CSS_RENAME_DICT[css] cp_file css, "#{BUILD_DIR}/#{CSS_RENAME_DICT[css]}" else cp_file css, "#{BUILD_DIR}/#{css}" end else # use java to compress js if CSS_RENAME_DICT[css] compress_css css, CSS_RENAME_DICT[css] else compress_css css, css end end end end def compress_js(js_file, to_file) puts "compressing javascript: #{js_file}" #sh "java -cp #{JS_COMPRESSION_CLASSPATH} com.yupoo.tools.JSCompressor -l #{js_file} #{BUILD_DIR}/#{to_file}" sh "java -cp #{JS_COMPRESSION_CLASSPATH} com.yahoo.platform.yui.compressor.YUICompressor --type js --charset utf-8 #{js_file} > #{BUILD_DIR}/#{to_file}" end def compress_css(css_file, to_file) puts "compressing css: #{css_file}" sh "java -cp #{JS_COMPRESSION_CLASSPATH} com.yahoo.platform.yui.compressor.YUICompressor --type css --charset utf-8 #{css_file} > #{BUILD_DIR}/#{to_file}" end desc "Package static web files" task :pkg_web do puts "Archiving static web files..." sh "tar -cf #{DEST_DIR}/web.tar.gz --directory=#{BUILD_DIR} web" end task :pkg_web => [ :make_dir_structure, :copy_web_files, :compress_js_files, :compress_css_files ] # Package App files ----------------------------------------------------------- APP_FILES = FileList[ 'web/**/*.jsp', 'web/**/*.xml', 'web/**/*.tld', 'web/**/*.properties' ].exclude('web/crossdomain.xml', 'web/WEB-INF/classes') desc "Copy application files..." task :copy_app_files do APP_FILES.each do |f| destfile = f.sub(/^web/, "app") cp_file f, "#{BUILD_DIR}/#{destfile}" end end task :copy_app_files => :make_dir_structure desc "Compile java source files use ajc" task :compile_java do puts "compile java..." sh "ajc -cp #{COMPILE_CLASSPATH} #{COMPILE_PARAMS} -sourceroots #{JAVA_SRC_DIR} -d #{COMPILE_DEST_DIR}" end task :compile_java => :make_dir_structure desc "Copy application configuration files" task :copy_app_conf do FileList['src/conf/**/*'].each do |f| destfile = f.sub(/^src\/conf\//, '') cp_file f, "#{BUILD_DIR}/app/WEB-INF/classes/#{destfile}" end end desc "Copy application configuration files" task :copy_webapp_conf do FileList['src/webapp/**/*.xml', 'src/webapp/**/*.properties', 'src/webapp/**/*.ftl'].each do |f| destfile = f.sub(/^src\/webapp\/(conf|resources)\//, '') cp_file f, "#{BUILD_DIR}/app/WEB-INF/classes/#{destfile}" end end desc "Copy production environment configuration files" task :copy_production_conf do FileList['metadata/webapp/**/*'].each do |f| destfile = f.sub(/^metadata\/webapp\//, '') cp_file! f, "#{BUILD_DIR}/app/#{destfile}" end end task :copy_libs do libs = collect_app_jars([], LIB['deploy-classpath']) libs.each do |jar| cp_file jar, "#{BUILD_DIR}/app/WEB-INF/lib/#{File.basename(jar)}" end end desc "Archive application files" task :archive_app do puts "Archiving application files..." sh "tar cfz #{DEST_DIR}/app.tar.gz --directory=#{BUILD_DIR}/app ." end task :pkg_app => [ :make_dir_structure, :copy_app_files, :copy_app_conf, :copy_production_conf, :copy_libs, :compile_java, :copy_webapp_conf, :archive_app ] task :pkg_app_nolib => [ :make_dir_structure, :copy_app_files, :copy_app_conf, :copy_production_conf, :compile_java, :copy_webapp_conf, :archive_app ] task :pkg_lib do puts "Archiving application libraries..." sh "tar cf #{DEST_DIR}/lib.tar --directory=#{BUILD_DIR}/app/WEB-INF/lib ." end # Deploy application ----------------------------- # Invoke the given actions via Capistrano def cap(*parameters) begin require 'rubygems' rescue LoadError # no rubygems to load, so we fail silently end require 'capistrano/cli' STDERR.puts "Capistrano/Rake integration is deprecated." STDERR.puts "Please invoke the 'cap' command directly: `cap #{parameters.join(" ")}'" Capistrano::CLI.new(parameters.map { |param| param.to_s }).execute! end namespace :remote do desc "Execute a specific action using capistrano" task :exec do unless ENV['ACTION'] raise "Please specify an action (or comma separated list of actions) via the ACTION environment variable" end actions = ENV['ACTION'].split(",") actions.concat(ENV['PARAMS'].split(" ")) if ENV['PARAMS'] cap(*actions) end end
主要ruby rake 它的make 比ant 和maven快多了。所以一直用这个了。现在给在大家分享一下。