Использование MSBuild для архивации нескольких каталогов проекта - PullRequest
4 голосов
/ 16 августа 2010

В рамках процесса сборки в MSBuild 4.0 я получаю следующую структуру каталогов:

\OutDir
    \ProjectA
      \File1.dll  
      \File2.dll  
      \File3.exe
    \ProjectB
      \Subfolder1
        File4.html
      \File5.dll  
      \File6.dll  
      \File7.exe
    \ProjectC
      \File8.dll  
      \File9.exe

Я хочу иметь возможность создать один zip-файл для каждой подпапки \OutDir. Если я сделаю следующее:

<ItemGroup>
  <ZipSource Include="\OutDir\**.*" />
</ItemGroup>

<MSBuild.Community.Tasks.Zip
  Files="@(ZipSource)"
  ZipFileName="OutDir\%(ZipSource.RecursiveDir)ZippedOutput.zip"
  WorkingDirectory="OutDir" />

затем каждая подпапка рекурсивно архивируется, что прекрасно работает для ProjectA и ProjectC, но ProjectB заканчивается двумя файлами zip, одним из его корневого уровня и одной из его подпапок.

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

Эта задача будет проста в NAnt благодаря задаче foreach, но как я могу добиться этого в MSBuild, предпочтительно, не прибегая к пользовательским задачам?

Ответы [ 2 ]

3 голосов
/ 17 августа 2010

Я нашел обходной путь - комбинацию задачи FileUnder пакета MSBuild Extension для перечисления папок ProjectX, которые я хочу сжать, и задачи Exec, вызывающей 7Zip.Код:

<MSBuild.ExtensionPack.FileSystem.FindUnder
    TaskAction="FindDirectories"
    Path="$(WebOutputFolder)"
    Recursive="False">
    <Output ItemName="WebsiteFolders" TaskParameter="FoundItems" />
</MSBuild.ExtensionPack.FileSystem.FindUnder>

<Exec Command="7za.exe a -r %22$(OutDir)%(WebsiteFolders.Filename)-$(Configuration)-$(AssemblyFileVersion).zip%22 %22@(WebsiteFolders)\*%22" />

Так что теперь каждый zip-файл назван в честь папки, из которой его содержимое (а также сведения о конфигурации и версиях), поэтому у меня будут файлы в выходной папке с именем ProjectA-Debug-0.1.2.345.zip и т. Д.

0 голосов
/ 16 августа 2010

Скорее всего, это произойдет потому, что встроенная zip-функция .Net Framework не может делать вложенные папки, только файлы - если используемая задача использует эту функцию, вам не повезет.

Также ваш синтаксисдля ZipSource Include="\OutDir\**.*" это немного неправильно, попробуйте вместо этого использовать <ZipSource Include="\OutDir\**\*.*".

Если это не сработает, попробуйте использовать задачу Zip из задач Расширение MSBuild , она делает то, что вам нужнонеобходимость.( Вот документ для него).

...