MS 빌드 항목에 저장된 디렉토리 목록 복사
-
12-12-2019 - |
문제
Temp 디렉토리에 복사하려는 파일의 일부 위치가 포함 된 텍스트 파일이 있습니다.
---- List.txt ----
Build\Java
Build\Classes
.
이제이 목록을 항목으로 가져오고 있습니다.
<ReadLinesFromFile File="List.txt" >
<Output TaskParameter="Lines"
ItemName="DirectoryList" />
</ReadLinesFromFile>
.
이제 전체 경로를 추가하고 일부 제외를 추가하려면 다시 다른 항목 그룹에 저장합니다.
<ItemGroup>
<PackageList Include="$(BuildPath)\%(DirectoryList.Identity)\**\*.*"
Exclude="$(BuildPath)\%(DirectoryList.Identity)\**\*.pdb" />
</ItemGroup>
<Copy SourceFiles="@(PackageList)"
DestinationFiles="@(PackageList->'$(PackageTemp)\%(SourceDirectory)\%(DirInPackage)%(RecursiveDir)%(Filename)%(Extension)')" />
.
문제 :
실제 dir -
C:\Work\Build\Java\Debug
C:\Work\Build\Java\Release
C:\Work\Build\Classes\*.class
.
o / p
의 함량C:\temp\Debug
C:\temp\Release
C:\temp\*.class
.
해당 "Java
"및 "Classes
"폴더를 복사하십시오.
해결책
arpit, 종류의 반전 된 솔루션을 사용할 수 있습니다. lext.txt를 복사본에서 제외 할 수 있습니다. 이 당신을 할 수 있습니다디렉터리 2 세트를 사용하여 CopyFileSlist를 만듭니다.
그래서 솔루션은 다음과 같습니다 :
---- List.txt ---- dirs to be excluded ---
Demos\AccessDatabase
Demos\ActiveDirectoryMsi
Demos\JavaToolsMsi
Demos\JavaToolsMsi\Data
Demos\LocalUserGroupsMsi
Demos\MSSQLDatabase
Demos\StringToolsMsi
Demos\SystemToolsMsi
Demos\TemplateFilesMsi
Demos\UserPrivilegesMsi
Demos\WindowsServiceMsi
Common
CustomActions
Framework
Tools
Version
WixExtensions
.
My Msbuild.Proj :
<Project DefaultTargets="run" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<Target Name="run">
<PropertyGroup>
<BuildPath>c:\tmp\msiext\msiext-1.3\trunk\src</BuildPath>
<PackageTemp>c:\tmp\</PackageTemp>
</PropertyGroup>
<ReadLinesFromFile File="List.txt" >
<Output TaskParameter="Lines"
ItemName="DirectoryList" />
</ReadLinesFromFile>
<Message Text="DirectoryList: @(DirectoryList)" />
<ItemGroup>
<PackageList Include="$(BuildPath)\%(DirectoryList.Identity)\**\*.*"
Exclude="$(BuildPath)\%(DirectoryList.Identity)\**\*.sql" />
</ItemGroup>
<!--<Message Text="PackageList: @(PackageList)" />-->
<Message Text="----------------------------------------------------------------------------" />
<CreateItem Include="$(BuildPath)\**\*.*" Exclude="@(PackageList)">
<Output TaskParameter="Include" ItemName="NeededFiles"/>
</CreateItem>
<Message Text="NeededFiles: @(NeededFiles)" />
<Message Text="----------------------------------------------------------------------------" />
<Copy SourceFiles="@(NeededFiles)" DestinationFiles="@(NeededFiles->'$(PackageTemp)\%(RecursiveDir)\%(Filename)%(Extension)')" />
</Target>
</Project>
. 다른 팁
스크립트에서 단 몇 순간을 놓 쳤습니다.먼저 @(PackageList)
에서 디렉토리를 만들어야합니다.둘째, Copy
태스크에서 DestinationFiles
를 설정하면 하위 디렉토리를 명시 적으로 지정해야합니다.
보세요.그 스크립트는 당신이 필요로하는 일을합니다.그리고 그것은 와일드 카드가 지정한 모든 하위 디렉토리의 내부 구조를 보유하고 있습니다.예를 들어, Java\Debug\Component1\file.ext
<Project DefaultTargets="CopyDirectories" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<BuildPath>.</BuildPath>
<SourceDirectoryListFile>Directories.txt</SourceDirectoryListFile>
<DestinationDirectory>temp</DestinationDirectory>
</PropertyGroup>
<Target Name="ReadDirectoryList">
<ReadLinesFromFile File="$(SourceDirectoryListFile)" >
<Output TaskParameter="Lines"
ItemName="DirectoryList" />
</ReadLinesFromFile>
</Target>
<Target Name="CopyDirectories" DependsOnTargets="ReadDirectoryList"
Outputs="%(DirectoryList.Identity)">
<PropertyGroup>
<ProcessingDirectory>%(DirectoryList.Identity)</ProcessingDirectory>
</PropertyGroup>
<ItemGroup>
<PackageList Include="$(BuildPath)\$(ProcessingDirectory)\**\*.*"
Exclude="$(BuildPath)\$(ProcessingDirectory)\**\*.pdb" />
</ItemGroup>
<MakeDir Directories="$(ProcessingDirectory)" />
<Copy SourceFiles="@(PackageList)"
DestinationFiles="@(PackageList->'$(DestinationDirectory)\$(ProcessingDirectory)\%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>
. 제휴하지 않습니다 StackOverflow