Hi,
Can anyone help me with what is hopefully a simple ant related
question? I think I may need to write a custom task, but what I am
trying to do seems simple and I may be overlooking a built-in
solution.
I am working with an ant based build system that packages a list of
resources into a jar file at build time. These consist of a number of
properties files and a certificates.
The build system creates builds for developer workstations, test
systems, and production systems. The location of the resource files
differs depending on which of these are being built, and where the
build is happening. I want to be able to specify the list of files
explicitly, naming each file rather than using wild-cards primarily so
that if files are missing the build can break.
I only want to specify the list of names once because otherwise people
will inevitably fail to update some of the places where the names are
repeated leading to wasted developer time.
I don't seem to be able to use <copy> with a <fileset> because that
won't fail if some of the files aren't found, and the base directory
must be specified, so I can't reuse the list in the different
contexts.
Currently the system uses just a comma separated list combined with a
<for> task and a <copy>. This is functional however the list cannot
have any whitespace in it and so leads to a very long and hard to read
line, or a very clumsy construction of a bigger properties list out of
a list of smaller lists.
At the moment, it seems to me that I need to extend with a 'lexical
list' or 'name list' kind of data structure, and a new kind of copy
task that can construct real paths from such a list by combining the
names with a path.
Do any ant experts out there have any opinions on this?
Thanks in advance.
-Robin
Roedy Green - 14 Sep 2007 12:26 GMT
>I only want to specify the list of names once because otherwise people
>will inevitably fail to update some of the places where the names are
>repeated leading to wasted developer time.
I handle this sort of problem by writing a STOMP program in Java that
cranks out all my ant scripts. That way I can be sure all my scripts
are consistently done. I can ensure a name in consistently spelled
throughout. I can use Java to compute constants rather than having to
use ant's convoluted techniques.

Signature
Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com
robin - 14 Sep 2007 20:12 GMT
On Sep 14, 4:26 am, Roedy Green <see_webs...@mindprod.com.invalid>
wrote:
> >I only want to specify the list of names once because otherwise people
> >will inevitably fail to update some of the places where the names are
[quoted text clipped - 8 lines]
> Roedy Green Canadian Mind Products
> The Java Glossaryhttp://mindprod.com
Thanks for the suggestion. I find it rather depressing that code
generation is th e only way to solve what seems like it should be a
common build problem. I think I'm going to go ahead and write the
custom task and type if I can.
Zig - 14 Sep 2007 23:26 GMT
As
> Currently the system uses just a comma separated list combined with a
> <for> task and a <copy>. This is functional however the list cannot
> have any whitespace in it and so leads to a very long and hard to read
> line, or a very clumsy construction of a bigger properties list out of
> a list of smaller lists.
One note: the Properties file format does allow you to break a logical
line into several by adding a '\' as the last character on a line. So, you
should be able to do something like
pkg1_base_dir=../over/there
pkg1_files=file1.dat, \
file2.dat, \
file3.dat
> At the moment, it seems to me that I need to extend with a 'lexical
> list' or 'name list' kind of data structure, and a new kind of copy
> task that can construct real paths from such a list by combining the
> names with a path.
You should be able to get this behavior by using a FileList:
http://ant.apache.org/manual/CoreTypes/filelist.html
Note that a filelist accepts whitespace as a valid delimiter, so you
should be able to make your properties file into something like:
pkg1_base_dir=../over/there
pkg1_list_file=pkg1_files.txt
Then your pkg1_files.txt could be a simple plain text file:
file1.dat
file2.dat
file3.dat
which you could put all together with something like:
<property file="build.properties" />
<loadfile
srcfile="${pkg1_list_file}"
property="pkg1_files"
/>
<copy todir="${output}">
<filelist
dir="${pkg1_base_dir}"
files="${pkg1_files}"
/>
</copy>
(untested)
HTH,
-Zig
robin - 16 Sep 2007 19:19 GMT
> As
>
[quoted text clipped - 54 lines]
>
> -Zig
Thanks - I'll give that a try.