concat как сбор ресурсов в zip не работает? - PullRequest
1 голос
/ 31 марта 2011

Я пытаюсь использовать <concat> в качестве коллекции ресурсов в задаче <zip>, и, согласно документации, это должно работать. Я хотел бы сделать это, потому что некоторые файлы, которые я хочу включить в zip, должны иметь расширенные свойства, поэтому я также добавлю <filterchain> к <concat>, чтобы сделать это. Я бы предпочел сделать это напрямую, а не копировать во временную папку (с заменой свойств) и включить копию в zip-файл.

Однако я не могу заставить <zip> правильно использовать элемент <concat>.

Упрощенный пример того, что я имею до сих пор:

<zip destfile="target/dist.zip">
   <concat>
      <fileset file="CHANGES.txt" />
   </concat>
</zip>

Это создает zip-файл, содержащий несколько каталогов с именем concat (C: (очевидно, это на компьютере с Windows).

Чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 01 апреля 2011

Мы с коллегой придумали ответ, просмотрев источник <zip> и <concat>.На самом деле есть два ответа:

  1. <concat> Реализация интерфейса ResourceCollection странная, но мы понимаем, почему.
  2. Есть способ обойти это.

Для # 1, в то время как <concat> - это ResourceCollection (например, FileSet), под капотом возвращается имя единственного Resource, содержащее жестко закодированное значение:

"concat (" + String.valueOf(c) + ")";

Выглядит знакомо?

Имя ресурсов обычно игнорируется - за исключением <zip> и связанных с ним задач, которые используют имя ресурса в качестве имени ZipEntry.Так как <concat> возвращает странное имя, это то, что мы получаем в zip-файле.

Я не совсем понял, почему я получаю несколько записей, но это не имеет значения: наблюдение ведет кзапутанное решение.

Поскольку я знаю имя ZipEntry, которое я хочу создать, я могу использовать <mapper>, чтобы присвоить ресурсу <concat> имя.Вот что я придумал во всей своей красе:

<zip destfile="target/distribution.zip">
    <fileset dir=".">
        <exclude name="target/**" />
        <exclude name="CHANGES.txt" />
    </fileset>
    <mappedresources>
        <concat>
            <fileset file="CHANGES.txt" />
            <filterchain>
                <expandproperties />
            </filterchain>
        </concat>
        <mergemapper to="CHANGES.txt" />
    </mappedresources>
</zip>

Как говорит мой коллега: «В Ant каждая проблема может быть решена с помощью картографа».

Это работает только для Ant 1.8+потому что в этот выпуск было добавлено <mappedresources>.

Я собираюсь опубликовать некоторые комментарии в списке рассылки Ant и предложить несколько улучшений:

  1. Разрешить имя ресурса длябыть указан как атрибут в <concat>, когда он используется в качестве ResourceCollection.
  2. Бросить исключение (и не создавать синтетическое значение), если вызывается getName() без указания значения.
  3. Наконец, хотя это и не связано напрямую, я бы хотел, чтобы <expandproperties> мог взять <propertyset>, чтобы я мог контролировать, какие свойства подставляются.
0 голосов
/ 31 марта 2011

Вы хотите, чтобы конечный почтовый индекс содержал один файл или несколько файлов?Насколько я вижу, использование concat (при успешном выполнении, которое не было сделано выше) приведет к созданию одного файла, в результате объединения всех файлов в коллекции ресурсов.

Если вам нужно несколько файловвместо конкатенации я думаю, что вам понадобится промежуточная копия.

Из руководства по Ant для задачи concat:

Начиная с Apache Ant 1.7.1, эту задачу можно использоватьв качестве коллекции ресурсов, которая будет возвращать ровно один ресурс.

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