2012-01-29 2 views
3

У меня есть папка с внешними файлами SVN, которая содержит много папок под названием *Plugin, а затем в каждой из этих папок находится папка modules и binaries.Nant fileset basedir с рисунком

Проблема для меня - в рамках моей задачи построения я хочу скопировать **/* из модулей в место в моем проекте, а также любое *.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

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

  • некоторого название папка (и все содержание)
  • другого названия-папка (и все содержание)
  • еще-другое название папки (и все содержимое)

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

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

<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> 

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

Проблема заключается в том, что если бы я должен был сделать этот путь вместо:

<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, а не просто длл, которую я хочу. То же самое с модулями ...

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

Итак, есть ли у меня способ иметь мой торт и есть его здесь?

ответ

3

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> 
+0

проблема, я действительно необходимо сохранить структуру папок внутри модулей каталогов нетронутыми. Поскольку я копирую корневую папку и все содержимое не просто набор файлов. – Grofit

+0

Возможно, создание отдельных наборов файлов с NAnt 'foreach' будет лучше подходит? Сначала получите набор файлов для каталогов, а затем повторите его. – skolima

+0

Есть ли у вас пример или ссылка, чтобы показать, как это будет работать, документация Nant в наши дни немного скудна. Я собирался использовать Rake, но не хотел, чтобы была зависимость от рубина и грабли. – Grofit

1

Ответ уже был включен в ваш вопрос: использовать <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> 
Смежные вопросы