我想避免对 AfterClean 目标中的 dll 和文件夹名称进行硬编码,是否有动态方法可以做到这一点?理想情况下,它只会删除 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>
项目结构:
源代码
消费项目
- ConsumingProject.csproj
ConsumingProject.sln
包
我的项目.5.7.0.12
构建
库
原生
插件
- VenusDvc.dll
SPM
- sSPM_1.bin
LumiAPI.dll
LumiCore.dll
LumiInOpAPI.dll
net45
my-project.5.7.0.12.nupkg
本质上,我想删除从 native 文件夹复制到项目输出的所有文件和文件夹(即 LumiAPI.dll、LumiCore.dll、SPM(文件夹)、eSPM_1.bin 等)。但是我希望它足够通用,这样如果我将另一个文件夹添加到 native 目录,它也会删除这些文件夹/文件。
最佳答案
使用列出输入和输出文件的单独目标,然后在其他两个目标中使用该列表。请注意,这使用 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>
关于msbuild - 删除从 AfterBuild 目标复制的文件和文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38935399/