过滤 CopyLocalLockFileAssemblies 输出

Filter CopyLocalLockFileAssemblies output

我将 CopyLocalLockFileAssemblies 设置为 true 并希望过滤输出。所以我使用了以下代码:

  <Target Name="FilterCopyLocalItems" AfterTargets="ResolveLockFileCopyLocalProjectDeps">
    <ItemGroup>
      <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(Filename)' == 'Microsoft.Extensions.DependencyInjection.Abstractions'" />
    </ItemGroup>
  </Target>

但是这段代码不起作用,我怎样才能对输出进行过滤?

您的目标 FilterCopyLocalItems 是从输出文件夹中删除引用 dll。

不知你的意思是目标无法执行

对我来说,我在我的网络核心项目中使用了下面的 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>,它的作用实际上是你的target的作用FilterCopyLocalItems。在运行时,删除输出文件夹中的相关 package.dllSee this document.

所以你应该删除它以避免重复使用。