buildr-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alex Boisvert <alex.boisv...@gmail.com>
Subject Re: Circular dependency with custom layout
Date Tue, 07 Dec 2010 17:48:57 GMT
On Tue, Dec 7, 2010 at 8:30 AM, Sebastiano Pilla <pilla@progiweb.com> wrote:

> I'm trying to use buildr in a multi-module ATG project, and the unit
> testing tool we use requires the test resources to end in the same directory
> as the test classes. I have defined a custom layout such as:
>
> # define the layout for our projects
> # src/main/java -> classes, src/test/java -> target/test-classes
> # src/test/resources -> target/test-classes
> StandardLayout = Layout.new
> StandardLayout[:source, :main, :java] = 'src/main/java'
> StandardLayout[:target, :main, :classes] = 'classes'
> StandardLayout[:source, :main, :resources] = 'resources'
> StandardLayout[:source, :test, :java] = 'src/test/java'
> StandardLayout[:source, :test, :resources] = 'src/test/resources'
> StandardLayout[:target, :test, :classes] = 'target/test-classes'
> StandardLayout[:target, :test, :resources] = 'target/test-classes'
>
> and I have assigned this layout to the project and subproject.
>
> The problem is that when I run buildr I get the following circular
> dependency error:
>
> D:\dev\progicommerce\src>%JRUBY_HOME%\bin\jruby -S buildr
> (in D:/dev/progicommerce/src, development)
> D:/dev/progicommerce/src/buildfile:4 warning: already initialized constant
> VERSION
> D:/dev/progicommerce/src/buildfile:7 warning: already initialized constant
> VERSION
> Building ProgiCommerce
> Buildr aborted!
> ←[31mRuntimeError : Circular dependency detected: TOP => default => build
> => ProgiCommerce:build => ProgiCommerce:ATGDUST:build =>
> ProgiCommerce:ATGDUST:test => ProgiCommerce:ATGDUST:test:compile =>
> ProgiCommerce:ATGDUST:test:resources =>
> D:/dev/progicommerce/src/ATGDUST/target/test-classes =>
> ProgiCommerce:ATGDUST:test:compile←[0m
>
> (See full trace by running task with --trace)
>
> Is there a way to have my test resources end in target/test-classes along
> with the test classes?
>

Hi Sebastiano,

It's not currently possible to map both (:target, :test, :resources) and
(:target, :test, :classes) to the same physical directory due to the way
resource copying/filtering is implemented.  Resource dependencies end up
being wired to the destination directory rather than the abstract task (e.g.
project:test:resources).  I think that's a minor design flaw.

You can work around this problem by adding the following to your project,

  task :copy_resources do
    Dir[_('target/test/resources/*')].each { |f| cp_r f,
_('target/test-classes') }
  end
  test.enhance [:copy_resources]

which copies over all test resources (after filtering) into
target/test-classes before tests run.

If you don't want to put this boilerplate in each of your project, you can
turn it into an
Extension<http://buildr.apache.org/rdoc/classes/Buildr/Extension.html>
such
as,

module ResourcesInTestClasses
  include Extension

  after_define do |project|
    task :copy_resources do
      Dir[project.path_to('target/test/resources/*')].each do |f|
        cp_r f, project.path_to('target/test-classes')
      end
    end
    project.test.enhance [:copy_resources]
  end

  class Buildr::Project
    include ResourcesInTestClasses
  end
end

and require this file at the top of your buildfile.

Hope this helps,
alex

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message