您的目标 FilterCopyLocalItems 是从输出文件夹中删除引用 dll。
不知你的意思是说目标无法执行。
对我来说,我在我的 net core 项目中使用了下面的 xml 代码,它安装了 nuget 包 Microsoft.Extensions.DependencyInjection.Abstractions。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
<Target Name="FilterCopyLocalItems" AfterTargets="ResolveLockFileCopyLocalProjectDeps">
<ItemGroup>
<ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(Filename)' == 'Microsoft.Extensions.DependencyInjection.Abstractions'" />
</ItemGroup>
</Target>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.6" />
</ItemGroup>
</Project>
您可以在详细输出构建日志下找到目标。
输入Tools-->Options-->Projects and Solutions-->Build and Run-->设置MSBuild project build output verbosity为详细。
您可以在构建时通过在详细的输出日志下搜索其名称来查看目标。
这将防止在输出文件夹中生成Microsoft.Extensions.DependencyInjection.Abstractions.dll。
更新 1
其实,你可能会做一些额外的操作,导致目标ResolveLockFileCopyLocalProjectDeps没有被触发。由于缺少您详细的项目结构和 CSPROJ 文件,我没有注意到。
对于您的情况,目标ResolvePackageDependenciesForBuild 效果很好。
所以在你这边,你应该使用这个:
<Target Name="FilterCopyLocalItems" AfterTargets="ResolvePackageDependenciesForBuild">
<ItemGroup>
<ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(Filename)' == 'Microsoft.Extensions.DependencyInjection.Abstractions'" />
</ItemGroup>
</Target>
另外,在你执行target的时候,请不要在你的nuget包的PackageReference下面加上<ExcludeAssets>Runtime</ExcludeAssets>,它的作用其实就是你的targetFilterCopyLocalItems的作用。在运行时,删除输出文件夹中相关的package.dll。 See this document.
所以你应该删除它以避免重复使用。