【问题标题】:Filter CopyLocalLockFileAssemblies output过滤 CopyLocalLockFileAssemblies 输出
【发布时间】:2020-07-16 19:12:40
【问题描述】:

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

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

但是这段代码不起作用,我怎样才能在输出上加一个过滤器?

【问题讨论】:

  • 您似乎使用了一个网络核心项目并在其中添加这些节点以从bin 输出文件夹中删除Microsoft.Extensions.DependencyInjection.Abstractions.dll。所以我只是想知道this code did not work 是什么意思?
  • 在“..\build\zip.props (2,40)”处的 AfterTargets 属性中列出的目标“ResolveLockFileCopyLocalProjectDeps”在项目中不存在,将被忽略。

标签: c# visual-studio .net-core msbuild


【解决方案1】:

您的目标 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下面加上&lt;ExcludeAssets&gt;Runtime&lt;/ExcludeAssets&gt;,它的作用其实就是你的targetFilterCopyLocalItems的作用。在运行时,删除输出文件夹中相关的package.dllSee this document.

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

【讨论】:

  • 非常感谢,是的,你没看错,我不会将一些程序集复制到输出文件夹中。为此,我使用 ResolveLockFileCopyLocalProjectDeps 过滤它们,但它不起作用,相反,我使用了 ResolvePackageDependenciesForBuild ,它工作正常。但是,我不打算在“Project.deps”文件中包含这些程序集的加载路径。我设计了一个模块化系统,这个请求的目的是从 DefaultAssemblyLoadContext 中加载一些程序集。我在github.com/dotnet/docs/issues/19448 中为此创建了一个问题
  • 抱歉没有得到你的项目结构和csproj文件,所以我没有注意到。感谢您与我们分享这一重要信息。另外,请删除&lt;ExcludeAssets&gt;Runtime&lt;/ExcludeAssets&gt;,它的效果和你的目标FilterCopyLocalItems一样。
  • 我已经更新了我的答案,因为我们讨论了关于执行目标而不是模块化系统的问题。所以我建议你可以标记这个答案,然后打开一张关于你在 SO 上的模块化系统问题的新票。:)
猜你喜欢
  • 1970-01-01
  • 2014-06-15
  • 2021-07-02
  • 2012-12-15
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
相关资源
最近更新 更多