Как работать с папками с помощью Msbuild?

Я использую msbuild сценарий для развертывания ssrs отчеты. Ранее все отчеты были в одной папке, и я написал msbuild скрипт для развертывания этих отчетов на сервере отчетов. Теперь мы поддерживаем отчеты на уровне папок, таких как customer service, inventory а также invoice папки.

Как развернуть эти отдельные папки на сервере отчетов? В сервере отчетов также нам нужна иерархия на уровне папок.

2 ответа

Вот пример рекурсивного копирования файла.

Сохраните нижеприведенное в файле с именем "FileCopyRecursive.msbuild" (или FileCopyRecursive.proj)

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="AllTargetsWrapped">

    <PropertyGroup>
        <!-- Always declare some kind of "base directory" and then work off of that in the majority of cases  -->
        <WorkingCheckout>.</WorkingCheckout>
        <WindowsSystem32Directory>c:\windows\System32</WindowsSystem32Directory>
        <ArtifactDestinationFolder>$(WorkingCheckout)\ZZZArtifacts</ArtifactDestinationFolder>
    </PropertyGroup>

    <Target Name="AllTargetsWrapped">

        <CallTarget Targets="CleanArtifactFolder" />
        <CallTarget Targets="CopyFilesToArtifactFolder" />
    </Target>

    <Target Name="CleanArtifactFolder">

        <RemoveDir Directories="$(ArtifactDestinationFolder)" Condition="Exists($(ArtifactDestinationFolder))"/>
        <MakeDir Directories="$(ArtifactDestinationFolder)" Condition="!Exists($(ArtifactDestinationFolder))"/>
        <RemoveDir Directories="$(ZipArtifactDestinationFolder)" Condition="Exists($(ZipArtifactDestinationFolder))"/>
        <MakeDir Directories="$(ZipArtifactDestinationFolder)" Condition="!Exists($(ZipArtifactDestinationFolder))"/>               
        <Message Text="Cleaning done" />
    </Target>

    <Target Name="CopyFilesToArtifactFolder">

        <ItemGroup>
            <MyExcludeFiles Include="$(WindowsSystem32Directory)\**\*.doesnotexist" />
        </ItemGroup>

        <ItemGroup>
            <MyIncludeFiles Include="$(WindowsSystem32Directory)\**\*.ini" Exclude="@(MyExcludeFiles)"/>
        </ItemGroup>        

        <Copy
                SourceFiles="@(MyIncludeFiles)"
                DestinationFiles="@(MyIncludeFiles->'$(ArtifactDestinationFolder)\%(RecursiveDir)%(Filename)%(Extension)')"
        />

        </Target>

    </Project>

Затем запустите это:

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" /target:AllTargetsWrapped FileCopyRecursive.msbuild /l:FileLogger,Microsoft.Build.Engine;logfile=AllTargetsWrapped.log

БОНУС!

Вот файл msbuild "весело с файлами".

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="AllTargetsWrapper" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <Target Name="AllTargetsWrapper">
        <CallTarget Targets="FunWithFilesTask" />
    </Target>

    <PropertyGroup>
        <WorkingCheckout>c:\windows\System32</WorkingCheckout>
    </PropertyGroup>

    <!--    =====================================================                      -->

    <!--
        See:
        http://msdn.microsoft.com/en-us/library/ms164313.aspx

        *Identity    Value for the item specified in the Include attribute.
        *Filename   Filename for this item, not including the extension.
        *Extension  File extension for this item.
        *FullPath   Full path of this item including the filename.
        *RelativeDir    Path to this item relative to the current working directory.
        *RootDir    Root directory to which this item belongs.
        RecursiveDir    Used for items that were created using wildcards. This would be the directory that replaces the wildcard(s) statements that determine the directory.
        *Directory  The directory of this item.
        AccessedTime    Last time this item was accessed.
        CreatedTime     Time the item was created.
        ModifiedTime    Time this item was modified.   

    -->


    <Target Name="FunWithFilesTask">

        <ItemGroup>
            <MyExcludeFiles Include="$(WorkingCheckout)\**\*.doesnotexist" />
        </ItemGroup>

        <ItemGroup>
            <MyIncludeFiles Include="$(WorkingCheckout)\**\*.ini" Exclude="@(MyExcludeFiles)" />
        </ItemGroup>  

        <PropertyGroup>
            <MySuperLongString>@(MyIncludeFiles->'&quot;%(fullpath)&quot;')</MySuperLongString>
        </PropertyGroup>  

        <Message Text="MySuperLongString=$(MySuperLongString)"/>
        <Message Text="   "/>
        <Message Text="   "/>

        <Message Text="The below items are good when you need to feed command line tools, like the console NUnit exe.  Quotes around the filenames help with paths that have spaces in them. "/>
        <Message Text="I found this method initially from : http://pscross.com/Blog/post/2009/02/22/MSBuild-reminders.aspx       Thanks Pscross! "/>
        <Message Text="   "/>
        <Message Text="   "/>

        <Message Text="Flat list, each file surrounded by quotes, with semi colon delimiter: "/>
        <Message Text="          @(MyIncludeFiles->'&quot;%(fullpath)&quot;')"/>
        <Message Text="   "/>
        <Message Text="   "/>

        <Message Text="Flat list, each file surrounded by quotes, no comma (space delimiter): "/>
        <Message Text="          @(MyIncludeFiles->'&quot;%(fullpath)&quot;' , ' ')"/>
        <Message Text="   "/>
        <Message Text="   "/>

        <Message Text="Flat list, each file surrounded by quotes, with comma delimiter: "/>
        <Message Text="          @(MyIncludeFiles->'&quot;%(fullpath)&quot;' , ',')"/>
        <Message Text="   "/>
        <Message Text="   "/>

        <Message Text="List of files using special characters (carriage return)"/>
        <Message Text="@(MyIncludeFiles->'&quot;%(fullpath)&quot;' , '%0D%0A')"/>
        <Message Text="   "/>
        <Message Text="   "/>

    </Target>

</Project>

Использовали ли вы задачу msbuild Copy для копирования в одну папку? Если это так, это не должно быть большой проблемой, чтобы немного изменить эту же задачу, чтобы скопировать всю структуру папок. Нечто похожее на этот пример:

<Copy SourceFiles="c:\src\**\*.txt" DestinationFolder="c:\dest\%(RecursiveDir)"></Copy>

%(RecursiveDir) тип известных метаданных элемента, который будет содержать значение подстановочного знака из параметра исходных файлов. Вот немного больше описания MSBuild общеизвестные метаданные:

MSBuild хорошо известные метаданные элемента


Полный пример:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Sources Include="c:\src\**\*.txt" />
  </ItemGroup>
  <Target Name="copy-folder">
    <Copy SourceFiles="@(Sources)" DestinationFolder="c:\dest\%(RecursiveDir)"></Copy>
  </Target>
</Project>
Другие вопросы по тегам