NuGet 包引用副本 dll 本地

NuGet Package references copies dll local

我有一些要求将 NuGet dll 的 Copy Local 设置为 false。在此之前,我使用 package.config 格式,一切正常。迁移到 Package Reference format 后,我找不到执行此操作的方法。有人可以帮助我吗?

最简单的方法是在引用选项卡下的解决方案资源管理器视图中右键单击 dll 和 select 属性。从那里您可以为整个包手动设置标志。

如果这对您的情况不起作用,那么您可以像以前一样以 package.config 格式设置复制本地标志,然后将该依赖项作为包参考迁移到您的项目中格式。

您可以使用私有资产。 Copied from the docs

<ItemGroup>
    <!-- ... -->

    <PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0">
        <PrivateAssets>all</PrivateAssets>
        <ExcludeAssets>runtime</ExcludeAssets>
    </PackageReference>

    <!-- ... -->
</ItemGroup>

我写了这个 msbuild 目标来破解 <packagereference ..><privateassets>all</privateassets>...<privateassets>runtime;... 以像旧的 <reference><private>true</private>... 一样工作(将 ref 上的本地 属性 复制设置为 false)。

在您的 .csproj 文件或解决方案根目录中的 Directory.Build.targets 文件中导入以下目标。

<!--
***********************************************************************************************
RemovePrivatePackageReference.targets

  This is a hack to ensure privateassets = all is handled similar to reference 
  private=true (copy local false) even for legacy nugets. 

  Note that this hack is only intended to help legacy solutions where nugets owners hasn't 
  updated their packages. It is not intended as a long-term sustainable solution. 

                                                                      [Anders Laub // Laub+Co]
***********************************************************************************************
-->

<Project>
  <Target Name="RemovePrivatePackageReference" AfterTargets="ResolveReferences">
    <ItemGroup>
      <_PrivatePackagesReferences Include="@(PackageReference)"
                                  Condition="%(PackageReference.PrivateAssets) == 'all' or $([System.String]::Copy('%(PackageReference.PrivateAssets)').Contains('runtime'))">
        <NuGetPackageId>%(Identity)</NuGetPackageId>
      </_PrivatePackagesReferences>
    </ItemGroup>
    <ItemGroup>
      <_ReferenceCopyLocalPathsFromPackages Include="@(ReferenceCopyLocalPaths)" Condition="%(ReferenceCopyLocalPaths.NuGetPackageId) != ''" />
    </ItemGroup>
    <ItemGroup>
      <_PrivatePackageReferenceCopyLocalPaths 
        Include="@(_ReferenceCopyLocalPathsFromPackages)" Condition="'%(NuGetPackageId)' != '' and '@(_PrivatePackagesReferences)' != ''" />
    </ItemGroup>
    <ItemGroup>
      <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(Identity)' != '' and '@(_PrivatePackageReferenceCopyLocalPaths)' != ''" />
    </ItemGroup>
  </Target>
</Project>

我确信可以通过某种方式优化项目组合并。希望对你有帮助,欢迎反馈。