Получение имени файла внутри фильтра задачи Ant copy - PullRequest
2 голосов
/ 07 декабря 2010

Возможно ли получить текущее имя файла, копируемого внутри задачи копирования Ant?Я пытаюсь запустить скрипт бобовой оболочки и хотел бы получить доступ к текущему имени файла:

<target>
    <mkdir dir="${project.build.directory}/generated-sources"/>
    <copy todir="${project.build.directory}/generated-sources"
          includeemptydirs="true" failonerror="true" verbose="true">
        <fileset dir="${project.build.sourceDirectory}"/>
        <filterchain>
            <tokenfilter>
                <filetokenizer/>
                <scriptfilter language="beanshell" byline="true"><![CDATA[
                    import java.io.BufferedReader;
                    import java.io.StringReader;
                    int count = 1;
                    BufferedReader br = new BufferedReader(new StringReader(self.getToken()));
                    StringBuilder builder = new StringBuilder();
                    String line;
                    while ((line = br.readLine()) != null) {
                        builder.append(line.replace("\"__LINE__\"", Integer.toString(count))).append('\n');
                        count++;
                    }
                    self.setToken(builder.toString());
                ]]></scriptfilter>
            </tokenfilter>
        </filterchain>
    </copy>
</target>

1 Ответ

3 голосов
/ 07 декабря 2010

Меня это некоторое время беспокоило - я надеялся, что будет хороший способ сделать это, но я пока не нашел его.

Я посмотрел исходный код Ant для задачи 'copy'. Фактическая копия выполняется в классе ResourceUtils , но имена исходных и целевых файлов не предоставляются таким образом, чтобы сделать их доступными из цепочки фильтров. Точно так же, итерация над набором файлов происходит в копировании taskdef, где «текущие» имена файлов не хранятся в открытых переменных.

Наименее плохой вариант, который я придумал, - это использовать ant-contrib 'for' task , чтобы перебрать набор файлов и скопировать каждый файл один за другим. После итерации имена файлов будут доступны в свойстве, указанном в атрибуте 'param':

<for param="file.name">
  <path>
    <fileset dir="${project.build.sourceDirectory}"/>
  </path>
  <sequential>
    <local name="file.name"/>
    <property name="file.name" value="@{file.name}"/>
    <copy file="${file.name}" ... >
      ...
      <filterchain>
        <scriptfilter ...>
          ...
          current_file = project.getProperty( "file.name" );
          ...
        </scriptfilter>
      </filterchain>
      ...
    </copy>
  </sequential>
</for>
...