2016-08-13 131 views
1

我想避免在AfterClean目標中對dll和文件夾名稱進行硬編碼,是否有動態的方式來執行此操作?理想情況下,它只會刪除AfterBuild目標中由副本創建的文件和文件夾。從AfterBuild目標中刪除複製的文件和文件夾

我試圖通過更改DestinationFolder在OutputPath中包含一個子目錄來簡化此操作。 AfterClean目標只需要在此時刪除該子目錄。但是,某些庫的DLLImport路徑不會考慮導致崩潰的子目錄。

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="AfterBuild"> 
    <ItemGroup> 
     <NativeLibs Include="$(MSBuildThisFileDirectory)..\lib\native\**\*.*" /> 
    </ItemGroup> 
    <Copy SourceFiles="@(NativeLibs)" DestinationFolder="$(OutputPath)\%(RecursiveDir)" /> 
    </Target> 
    <Target Name="AfterClean"> 
    <Delete Files="$(OutputPath)\LumiAPI.dll" /> 
    <Delete Files="$(OutputPath)\LumiCore.dll" /> 
    <Delete Files="$(OutputPath)\LumiInOpAPI.dll" /> 
    <RemoveDir Directories="$(OutputPath)\SPM" /> 
    <RemoveDir Directories="$(OutputPath)\plugin" /> 
    </Target> 
</Project> 

項目結構:

SRC

  • ConsumingProject

    • ConsumingProject.csproj
  • Consumin gProject.sln

    • 我-project.5.7.0.12

      • 構建

      • LIB

        • 本地

          • 插件

            • VenusDvc.dll
          • SPM

            • sSPM_1.bin
          • LumiAPI。 dll的

          • LumiCore.dll

          • LumiInOpAPI.dll

        • net45

      • 我-project.5.7.0.12。nupkg

基本上我想刪除所有來自本地文件夾複製到項目的輸出文件和文件夾(即LumiAPI.dll,LumiCore.dll,SPM(文件夾),eSPM_1.bin等)。但是我希望它足夠通用,這樣如果我將其他文件夾添加到本機目錄,它也會刪除這些文件夾/文件。

回答

1

使用列出輸入和輸出文件的單獨目標,然後在其他目標中使用該列表。請注意,它使用Copy任務中的DestinationFiles屬性而不是DestinationFolders。並且它可能會打印一些關於傳遞給RemoveDir的不存在的目錄的消息,因爲頂級目錄已經在子目錄之前被刪除。

更新因爲你不想刪除根輸出目錄,因爲它仍然有文件,想通應用「只刪除輸出目錄,如果它是空的」任何目標目錄的原則可能是要走的最安全的方式。積分爲the answer here

<Target Name="GetMyOutputFiles"> 
    <ItemGroup> 
    <NativeLibs Include="$(MSBuildThisFileDirectory)..\lib\native\**\*.*" /> 
    <!--Now add some metadata: output dir and output file--> 
    <NativeLibs> 
     <DestinationDir>$(OutputPath)\%(RecursiveDir)</DestinationDir> 
     <Destination>$(OutputPath)\%(RecursiveDir)%(FileName)%(Extension)</Destination> 
    </NativeLibs> 
    </ItemGroup> 
</Target> 

<Target Name="AfterBuild" DependsOnTargets="GetMyOutputFiles"> 
    <!--Copy one-to-one--> 
    <Copy SourceFiles="@(NativeLibs)" DestinationFiles="@(NativeLibs->'%(Destination)')" /> 
</Target> 

<Target Name="AfterClean" DependsOnTargets="GetMyOutputFiles"> 
    <Delete Files="@(NativeLibs->'%(Destination)')" /> 

    <!--Find number of files left in each destination directory--> 
    <ItemGroup> 
    <NativeLibs> 
     <NumFiles>0</NumFiles> 
     <!--Condition is to avoid errors when e.g. running this target multiple times--> 
     <NumFiles Condition="Exists(%(DestinationDir))">$([System.IO.Directory]::GetFiles("%(DestinationDir)", "*", System.IO.SearchOption.AllDirectories).get_Length())</NumFiles> 
    </NativeLibs> 
    </ItemGroup> 

    <!--Only remove empty directories, use 'Distinct' to skip duplicate directories--> 
    <RemoveDir Directories="@(NativeLibs->'%(DestinationDir)'->Distinct())" Condition="%(NumFiles)=='0'" /> 
</Target> 
+0

我收到錯誤「Unable to remove directory」bin \ Debug \\「。訪問路徑'HTA.vshost.exe'被拒絕。」它不應該刪除調試文件夾 – Robert

+0

請編輯您的問題,以澄清a)你的目錄結構是什麼和b)你想要刪除的是什麼。 – stijn

+0

我更新了我的問題 – Robert