Nant fileset basedir с шаблоном - PullRequest
       36

Nant fileset basedir с шаблоном

3 голосов
/ 29 января 2012

У меня есть папка SVN externals, которая содержит много папок с именем *Plugin, затем в каждой из этих папок есть папка modules и папка binaries.

Проблема для меня заключается в том, что в рамках моей задачи сборки я хочу скопировать **/* из модулей в папку в моем проекте, а также любые *.plugin.dll из расположения двоичных файлов в другое место моего проекта.

Итак, вот фиктивный пример:

- DummyPlugin1
  |- binaries
     |- some.assembly.dll
     |- some.plugin.dll
  |- modules
     |- some-named-folder
        |- some-sub-folder
           |- some.content.xml
        |- some-other-sub-folder
           |- yet-another-folder
              |- some.more.content.jpg
- DummyPlugin2
  |- binaries
     |- some.other.plugin.dll
  |- modules
     |- another-named-folder
        |- content.xml
        |- image.jpg
     |- yet-another-named-folder
        |- some-web-page.html

Так что в этом примере я бы хотел скопировать:

  • some.plugin.dll
  • some.other.plugin.dll

В заданный выходной каталог, затем из каталога модулей я хотел бы взять:

  • some-named-folder (и все содержимое)
  • another-named-folder (и все содержимое)
  • but-another-named-folder (и все содержимое)

и поместите все это в другой заданный выходной каталог.

Я пытался сделать это:

<copy todir="${dir.projects.dynamic.binaries}">
    <fileset basedir="${dir.plugins}/**/binaries">
        <include name="*.plugin.dll" />
    </fileset>
</copy>
<copy todir="${dir.projects.dynamic.modules}">
    <fileset basedir="${dir.plugins}/**/modules">
        <include name="**/*" />
    </fileset>
</copy>

Тем не менее, я получаю сообщение об ошибке, в котором говорится, что в зависимости от набора файлов не может быть ** или любых других недействительных символов. Документация кажется немного расплывчатой ​​относительно того, можете ли вы или не можете использовать шаблоны в основе вашего набора файлов, или нет, однако я предполагаю, что после этой ошибки я не могу.

Проблема в том, что если бы я сделал это вместо этого:

<copy todir="${dir.projects.dynamic.binaries}">
    <fileset basedir="${dir.plugins}">
        <include name="**/binaries/*.plugin.dll" />
    </fileset>
</copy>
<copy todir="${dir.projects.dynamic.modules}">
    <fileset basedir="${dir.plugins}">
        <include name="**/modules/**/*" />
    </fileset>
</copy>

Однако он копирует родительские папки, то есть DummyPlugin1/binaries/some.assembly.dll, DummyPlugin2/binaries/some.other.plugin.dll, а не просто dll, который я хочу. То же самое с модулями ...

Я знаю, что мог бы изменить basedir, чтобы включить DummyPlugin1 / binaries, DummyPlugin2 / binaries, но я не знаю, сколько там будет папок или как их имена, не меняя сценарий сборки постоянно, поэтому я бы предпочел оставить его динамический, поэтому он будет просто извлекать все плагины и модули для меня, а не для меня, чтобы сделать копию для КАЖДОЙ папки плагинов, которая может быть или не быть там.

Так есть ли для меня способ съесть свой пирог и съесть его здесь?

Ответы [ 2 ]

3 голосов
/ 29 января 2012

basedir должен быть одним каталогом, но вы должны быть в состоянии выполнить то, что хотите, используя опцию flatten, которая помещает все входные файлы в один выходной каталог (игнорируя пути, в основном).

Прочитав ваш вопрос еще раз: вы можете попробовать это?

<copy todir="${dir.projects.dynamic.binaries}" flatten="true">
    <fileset>
        <include name="${dir.plugins}/**/binaries/*.plugin.dll" />
    </fileset>
</copy>
<copy todir="${dir.projects.dynamic.modules}">
    <fileset basedir="${dir.plugins}">
        <include name="/**/modules/**/*" />
    </fileset>
</copy>
1 голос
/ 01 февраля 2012

Ответ уже включен в ваш вопрос: используйте цикл <foreach>:

<foreach item="Folder" property="binaries.path">
  <in>
    <items basedir="${dir.plugins}">
      <include name="**/binaries" />
    </items>
  </in>
  <do>
    <copy todir="${dir.projects.dynamic.binaries}">
      <fileset basedir="${binaries.path}">
        <include name="*.plugin.dll" />
      </fileset>
    </copy>
  </do>
</foreach>
<foreach item="Folder" property="modules.path">
  <in>
    <items basedir="${dir.plugins}">
      <include name="**/modules" />
    </items>
  </in>
  <do>
    <copy todir="${dir.projects.dynamic.modules}">
      <fileset basedir="${modules.path}">
        <include name="**/*" />
      </fileset>
    </copy>
  </do>
</foreach>
...