Муравей публикует вещи в разных местах - PullRequest
1 голос
/ 12 ноября 2011

У меня есть проект Java и сценарий ANT для создания, а затем распространения проекта в другие проекты с помощью простой команды копирования.

Я бы хотел назвать только место, куда копировать файлы, в заголовок скрипта ant, и не указывать явную задачу копирования для каждого проекта, который зависит от этого проекта.

Я не могу найти ничего похожего на массивы в ANT, так что будет самым чистым способом распределения чего-либо по нескольким каталогам?

Ответы [ 3 ]

1 голос
/ 12 ноября 2011

Вы можете рассмотреть возможность использования scriptmapper в своей задаче копирования с enablemultiplemappings true.

Сначала перечислите целевые каталоги в свойстве и создайте из него filelist,(Вы можете использовать dirset, но API для filelist проще.) Затем запустите копию, и скрипт-маппер установит несколько адресатов.

<property name="dest.dirs" value="/dir/one,/dir/two,/dir/thr/ee" />    
<filelist id="dests" dir="/" files="${dest.dirs}" />

<copy todir="/" enablemultiplemappings="yes">
    <fileset dir="${srd.dir}" />
    <scriptmapper language="javascript">
        <![CDATA[
            // Obtain a reference to the filelist
            var filelist = project.getReference( "dests" );

            var dests = filelist.getFiles( project );
            for ( var i = 0; i < dests.length; i++ )
            {
                self.addMappedName( dests[i] + "/" + source );
            }
        ]]>
    </scriptmapper>
</copy>
1 голос
/ 14 ноября 2011

Согласно тому, что я прокомментировал под ответом Мартина, я хотел бы опубликовать свою версию решения в качестве другого варианта. И я использую имена свойств из ответа Мартина, чтобы прояснить ситуацию.

<target name="deploy" >
    <property name="dest.dirs" value="/dir/one,/dir/two,/dir/thr/ee" />
    <for list="${dest.dirs}" param="dest.dir" parallel="true" delimiter="," >
        <sequential>
            <copy todir="@{dest.dir}" >
                <fileset dir="${srd.dir}" />
            </copy>
        </sequential>
    </for>
</target>

Обратите внимание, что «for» - это задача Ant-Contrib, и она использует Macrodef сзади, поэтому вы должны использовать @ {} для ссылки на «dest.dir»; "dest.dirs" будет разделен на список (возможно, String []) разделителем. Здесь мы используем запятую, чтобы разделить ее (и значение по умолчанию для разделителя - запятая). Я также добавил «параллельный», чтобы он копировал файлы во все «dest.dirs» одновременно, однако, если проект для копирования большой, вы должны удалить «параллельный».

Пожалуйста, проверьте http://ant -contrib.sourceforge.net / tasks / tasks / for.html и http://ant -contrib.sourceforge.net / tasks / tasks / foreach.html для получения дополнительной информации.

1 голос
/ 12 ноября 2011

Не думаю, что у вас есть много жизнеспособных вариантов: задача copy принимает только один каталог.

  1. Создайте собственную задачу копирования со списком каталогов.
  2. Выполните скрипт / программу, которая выполняет копирование.
  3. Сделайте так, чтобы подпроекты выполняли свою работу.

Я очень сомневаюсь в том, что проект подтолкнет к другим проектам, потому что это делает предположение, что эти проекты будут работать с недавно добавленным кодом. ИМО, «под» проекты должны принимать решение, хотят они новую версию или нет.

Для меня это больше похоже на проблему управления зависимостями, лучше решаемую с помощью Ivy / Maven / Gradle (или других подобных Maven).

С учетом всего вышесказанного звучит так, как будто вы хотите выполнить вариант 1: создать настраиваемую задачу Ant, которая принимает список каталогов назначения; может быть довольно просто расширить существующую задачу копирования, чтобы получить все ее функциональные возможности - просто добавьте свойство todirs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...