Alex Boisvert wrote:
On Tue, Dec 7, 2010 at 8:30 AM, Sebastiano Pilla<[email protected]> 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

I've tried your first solution and it worked perfectly, I will shortly implement the extension as it looks cleaner indeed. Now I have to deal with my unit tests failing, but that's another issue :-)

Thank you very much for your help.

Sebastiano

Reply via email to