You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@buildr.apache.org by Peter Donald <do...@apache.org> on 2013/08/14 03:31:32 UTC

Fwd: svn commit: r1513707 - in /buildr/trunk: CHANGELOG addon/buildr/gwt.rb doc/packaging.textile lib/buildr.rb lib/buildr/core/assets.rb lib/buildr/ide/idea.rb lib/buildr/java/packaging.rb spec/java/packaging_spec.rb

Hi,

I just committed some very basic support for web asset management within
buildr. We have been using several variants of this for the last year or so
and am interested to see if other people have the same sorts of
requirements.

The end goal is to integrate with other more modern javascript/css tools
(i.e. bower/grunt/npm/etc)  but use buildr to drive the main workflow.

Anyhoo - I am just about to head out on a holiday but thought I would
commit add this before I left to see if anyone had better ideas which could
be  implemented when I got back.

---------- Forwarded message ----------
From: <do...@apache.org>
Date: Wed, Aug 14, 2013 at 11:23 AM
Subject: svn commit: r1513707 - in /buildr/trunk: CHANGELOG
addon/buildr/gwt.rb doc/packaging.textile lib/buildr.rb
lib/buildr/core/assets.rb lib/buildr/ide/idea.rb
lib/buildr/java/packaging.rb spec/java/packaging_spec.rb
To: commits@buildr.apache.org


Author: donaldp
Date: Wed Aug 14 01:23:28 2013
New Revision: 1513707

URL: http://svn.apache.org/r1513707
Log:
Initial support for simple integration of an asset pipeline.

See "Compiling Assets" section in the manual.

Added:
    buildr/trunk/lib/buildr/core/assets.rb
Modified:
    buildr/trunk/CHANGELOG
    buildr/trunk/addon/buildr/gwt.rb
    buildr/trunk/doc/packaging.textile
    buildr/trunk/lib/buildr.rb
    buildr/trunk/lib/buildr/ide/idea.rb
    buildr/trunk/lib/buildr/java/packaging.rb
    buildr/trunk/spec/java/packaging_spec.rb

Modified: buildr/trunk/CHANGELOG
URL:
http://svn.apache.org/viewvc/buildr/trunk/CHANGELOG?rev=1513707&r1=1513706&r2=1513707&view=diff
==============================================================================
--- buildr/trunk/CHANGELOG (original)
+++ buildr/trunk/CHANGELOG Wed Aug 14 01:23:28 2013
@@ -1,4 +1,6 @@
 1.4.13 (Pending)
+* Added:  Initial support for simple integration of an asset pipeline.
+          See "Compiling Assets" section in the manual.
 * Fixed:  BUILDR-673 - Fix the option handling of the MultiTest test
           framework to behave as documented. Only the framework specific
           options are passed to the test. Submitted by John Roth.

Modified: buildr/trunk/addon/buildr/gwt.rb
URL:
http://svn.apache.org/viewvc/buildr/trunk/addon/buildr/gwt.rb?rev=1513707&r1=1513706&r2=1513707&view=diff
==============================================================================
--- buildr/trunk/addon/buildr/gwt.rb (original)
+++ buildr/trunk/addon/buildr/gwt.rb Wed Aug 14 01:23:28 2013
@@ -105,6 +105,7 @@ module Buildr
         end
         task.enhance(dependencies)
         task.enhance([project.compile])
+        project.assets.paths << task
         task
       end


Modified: buildr/trunk/doc/packaging.textile
URL:
http://svn.apache.org/viewvc/buildr/trunk/doc/packaging.textile?rev=1513707&r1=1513706&r2=1513707&view=diff
==============================================================================
--- buildr/trunk/doc/packaging.textile (original)
+++ buildr/trunk/doc/packaging.textile Wed Aug 14 01:23:28 2013
@@ -235,6 +235,35 @@ puts 'Artifacts included in WAR package:
 puts package(:war).libs.map(&:to_spec)
 {% endhighlight %}

+h3(#war_extra_assets). Compiling Assets
+
+In modern web applications, it is common to use tools that compile and
compress assets. i.e. "Coffeescript":http://coffeescript.org/ is compiled
into javascript and "Sass":http://sass-lang.com/ compiles into CSS. Buildr
provides support using a simple @assets@ abstraction. Directory or file
tasks can be added to the @assets.paths@ configuration variable for a
project and the contents will be included in the package.
+
+h4(#coffeescript). Integrating CoffeeScript
+
+{% highlight ruby %}
+target_dir = _(:target, :generated, "coffee/main/webapp")
+source_dir = _(:source, :main, :coffee)
+
+assets.paths << file(target_dir =>
[FileList["#{source_dir}/**/*.coffee"]]) do
+  puts "Compiling coffeescript"
+  sh "coffee --bare --compile --output #{target_dir} #{source_dir}"
+  touch target_dir
+end
+{% endhighlight %}
+
+h4(#sass). Integrating Sass
+
+{% highlight ruby %}
+target_dir = _(:target, :generated, "sass/main/webapp")
+source_dir = _(:source, :main, :sass)
+
+assets.paths << file(target_dir => [FileList["#{source_dir}/**/*.scss"]])
do
+  puts "Compiling scss"
+  sh "scss -q --update #{source_dir}:#{target_dir}"
+  touch target_dir
+end
+{% endhighlight %}

 h2(#aar). Packaging AARs


Modified: buildr/trunk/lib/buildr.rb
URL:
http://svn.apache.org/viewvc/buildr/trunk/lib/buildr.rb?rev=1513707&r1=1513706&r2=1513707&view=diff
==============================================================================
--- buildr/trunk/lib/buildr.rb (original)
+++ buildr/trunk/lib/buildr.rb Wed Aug 14 01:23:28 2013
@@ -42,6 +42,7 @@ require 'buildr/core/common'
 require 'buildr/core/application'
 require 'buildr/core/jrebel'
 require 'buildr/core/project'
+require 'buildr/core/assets'
 require 'buildr/core/environment'
 require 'buildr/core/help'
 require 'buildr/core/checks'

Added: buildr/trunk/lib/buildr/core/assets.rb
URL:
http://svn.apache.org/viewvc/buildr/trunk/lib/buildr/core/assets.rb?rev=1513707&view=auto
==============================================================================
--- buildr/trunk/lib/buildr/core/assets.rb (added)
+++ buildr/trunk/lib/buildr/core/assets.rb Wed Aug 14 01:23:28 2013
@@ -0,0 +1,93 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
this
+# work for additional information regarding copyright ownership.  The ASF
+# licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
under
+# the License.
+
+module Buildr #:nodoc:
+
+  module Assets #:nodoc:
+
+    # The base assets task that is responsible for
+    # collecting all of the assets into a single output
+    # directory
+    class AssetsTask < Rake::FileTask
+      attr_reader :project
+
+      def project=(project)
+        @project = project
+      end
+
+      # The list of input paths to add to output directory
+      def paths
+        unless @paths
+          @paths = []
+          @paths << project._(:source, :main, :webapp) if
File.exist?(project._(:source, :main, :webapp))
+        end
+        @paths
+      end
+
+      protected
+
+      def initialize(*args) #:nodoc:
+        super
+        enhance do
+          mkdir_p name
+          self.paths.flatten.compact.collect do |a|
+            a.is_a?(String) ? project.file(a) : a
+          end.each do |a|
+            a.invoke if a.respond_to?(:invoke)
+          end.each do |asset|
+            cp_r Dir["#{asset}/*"], "#{name}/"
+          end
+        end
+      end
+
+      private
+
+      def out_of_date?(stamp)
+        super ||
+          self.paths.any? { |n| n.respond_to?(:needed?) && n.needed? }
+      end
+
+    end
+
+    module ProjectExtension
+      include Extension
+
+      first_time do
+        desc "Prepare the assets"
+        Project.local_task("assets")
+      end
+
+      # Access the asset task
+      def assets
+        if @assets.nil?
+          @assets = AssetsTask.define_task(project._(:target, :main,
:webapp) => [])
+          @assets.project = self
+          project.task('assets').enhance([@assets])
+          project.build.enhance([@assets])
+        end
+        @assets
+      end
+
+      after_define do |project|
+        # Force construction
+        project.assets
+      end
+    end
+  end
+end
+
+class Buildr::Project #:nodoc:
+  include ::Buildr::Assets::ProjectExtension
+end

Modified: buildr/trunk/lib/buildr/ide/idea.rb
URL:
http://svn.apache.org/viewvc/buildr/trunk/lib/buildr/ide/idea.rb?rev=1513707&r1=1513706&r2=1513707&view=diff
==============================================================================
--- buildr/trunk/lib/buildr/ide/idea.rb (original)
+++ buildr/trunk/lib/buildr/ide/idea.rb Wed Aug 14 01:23:28 2013
@@ -299,7 +299,7 @@ module Buildr #:nodoc:
       def add_web_facet(options = {})
         name = options[:name] || "Web"
         url_base = options[:url_base] || "/"
-        default_webroots = [buildr_project._(:source, :main, :webapp)]
+        default_webroots = project.assets.paths
         webroots = options[:webroots] || default_webroots
         default_web_xml = "#{buildr_project._(:source, :main,
:webapp)}/WEB-INF/web.xml"
         web_xml = options[:web_xml] || default_web_xml

Modified: buildr/trunk/lib/buildr/java/packaging.rb
URL:
http://svn.apache.org/viewvc/buildr/trunk/lib/buildr/java/packaging.rb?rev=1513707&r1=1513706&r2=1513707&view=diff
==============================================================================
--- buildr/trunk/lib/buildr/java/packaging.rb (original)
+++ buildr/trunk/lib/buildr/java/packaging.rb Wed Aug 14 01:23:28 2013
@@ -685,8 +685,12 @@ module Buildr #:nodoc:
           war.with :classes=>[compile.target, resources.target].compact
           war.with :libs=>compile.dependencies
           # Add included files, or the webapp directory.
-          webapp = path_to(:source, :main, :webapp)
-          war.with webapp if File.exist?(webapp)
+          assets.paths.each do |asset|
+            war.tap do |war|
+              war.enhance([asset])
+            end
+            war.include asset, :as => '.'
+          end
         end
       end


Modified: buildr/trunk/spec/java/packaging_spec.rb
URL:
http://svn.apache.org/viewvc/buildr/trunk/spec/java/packaging_spec.rb?rev=1513707&r1=1513706&r2=1513707&view=diff
==============================================================================
--- buildr/trunk/spec/java/packaging_spec.rb (original)
+++ buildr/trunk/spec/java/packaging_spec.rb Wed Aug 14 01:23:28 2013
@@ -530,6 +530,26 @@ describe Packaging, 'war' do
     inspect_war { |files| files.should include('test.html') }
   end

+  it 'should use files from added assets directory if nothing included' do
+    write 'generated/main/webapp/test.html'
+    define('foo', :version => '1.0') { assets.paths <<
'generated/main/webapp/'; package(:war) }
+    inspect_war { |files| files.should include('test.html') }
+  end
+
+  it 'should use files from generated assets directory if nothing
included' do
+    write 'generated/main/webapp/test.html'
+    define('foo', :version => '1.0') do
+      target_dir = _('generated/main/webapp')
+      assets.paths << project.file(target_dir) do
+        mkdir_p target_dir
+        touch "#{target_dir}/test.html"
+        touch target_dir
+      end
+      package(:war)
+    end
+    inspect_war { |files| files.should include('test.html') }
+  end
+
   it 'should accept files from :classes option' do
     write 'src/main/java/Test.java', 'class Test {}'
     write 'classes/test'