2014-11-27 3 views
3

현재 첫 번째 MSBuild 스크립트를 만듭니다. 완벽하게 작동File :: 사용중인 조건이 작동하지 않습니다.

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 
    <Target Name="Build"> 
    <PropertyGroup> 
     <RootFolder>tmp</RootFolder> 
    </PropertyGroup> 
    <ItemGroup> 
     <Folders Include="$([System.IO.Directory]::GetDirectories(&quot;$(RootFolder)&quot;))"/> 
    </ItemGroup> 
    <Message Text="@(Folders -> '%(FullPath)\Bin\Debug\%(Filename)%(Extension).dll', ';')"/> 
    </Target> 
</Project> 

:

나는 주어진 루트 경로에있는 모든 디렉토리를 findes 태그 "폴더"를했습니다. 제 문제는 지정된 파일이있는 디렉토리 만 있으면된다는 것입니다. 나는 폴더 태그이

Condition="$([System.IO.File]::Exists(&quot;%(FullPath)\\Bin\\Debug\\%(Filename)%(Extension).dll&quot;))" 

같은 조건을 시도했다.

이 스크립트는 오류없이 실행되지만 내 목록은 비어 있습니다. 왜?

파일을 확인할 다른 해결책이 있습니까?

C#을 사용하고 저는 C# - 개발자이기 때문에이 솔루션을 사용했습니다.

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 
    <Target Name="Build"> 
    <PropertyGroup> 
     <RootFolders>tmp</RootFolders> 
    </PropertyGroup> 
    <GetFiles rootFolders="$(RootFolders)"> 
     <Output PropertyName="Files" TaskParameter="Files" /> 
    </GetFiles> 
    <Message Text="$(Files)" /> 
    </Target> 

    <UsingTask 
     TaskName="GetFiles" 
     TaskFactory="CodeTaskFactory" 
     AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> 
     <ParameterGroup> 
     <rootFolders ParameterType="System.String" Required="true" /> 
     <files ParameterType="System.String" Output="true" /> 
     </ParameterGroup> 
     <Task> 
      <Using Namespace="System" /> 
      <Using Namespace="System.IO" /> 
      <Using Namespace="System.Linq" /> 
      <Code Type="Fragment" Language="cs"> 
       <![CDATA[    
        Func<string, string> BuildFilePath = path => path + @"\Bin\Debug\" + Path.GetFileName(path) + ".dll"; 
        var dirs = Directory.GetDirectories(rootFolders).Where(x => File.Exists(BuildFilePath(x))); 
        files = string.Join("\n", dirs.Select(BuildFilePath)); 
       ]]> 
      </Code> 
     </Task> 
    </UsingTask> 
</Project> 

답변

1

AFAIK, 건 Condition 실행 및 항목의 전체 선언 (즉 <Folders ..> 태그)에 대해 체크된다.

생각해 보면 컬렉션을 반복하여 (예 : 대상/작업 일괄 처리를 사용하여) 컬렉션의 모든 단일 폴더 폴더에 파일이 존재하는지 확인해야합니다. 그런 다음 파일이있는 경우 새로운 <FoldersFiletered> 항목 컬렉션에 파일을 포함시킵니다.

NB : 지금 코드를 테스트 할 시간이 없다, 그러나 이것은 대략 생각이다 :

<Target Name="FilterFolders" 
    Inputs="@(Folders)" 
    Outputs="%(FullPath)"> 
    <ItemGroup> 
    <FoldersFiltered Include="@(Folders->'%(FullPath)')" 
     Condition="$([System.IO.File]::Exists(&quot;@(Folders->'%(FullPath)'\\Bin\\Debug\\YourFile.dll&quot;))" /> 
    </ItemGroup> 
</Target> 
+1

들으하지만 C#을 -developer 해요 코드를 인라인 해결책을 발견했다. 이제 C#에서 모든 작업을 수행 할 수 있습니다. –