NuGet包引用会将DLL复制到本地

7

我需要将NuGet dll的Copy Local设置为false。在那之前,我使用了package.config格式,一切都很顺利。迁移到Package Reference format后,我无法找到如何做到这一点。有人可以帮我吗?


1
问题:如果NuGet包配置为期望部署库,为什么要覆盖它?难道不是意图让您的应用程序正常工作吗?(注意:nupkg不必这样做,但这是正常和默认配置) - Marc Gravell
对我来说,这是一个冲突,其中具有相同引用的延迟加载组件会导致错误。 - Ed Hartley
3个回答

10

您可以使用PrivateAssets。从文档中复制

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

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

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

1
我编写了这个msbuild目标来修改<packagereference ..><privateassets>all</privateassets>...或者<privateassets>runtime;...,使其像旧的<reference><private>true</private>...一样(在引用设置为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>

我相信项目组合并可以在某种程度上进行优化。希望能有所帮助,欢迎反馈。


0
最简单的方法是右键单击dll文件,在“解决方案资源管理器”视图下的“引用”选项卡中选择“属性”。从那里,您可以手动设置整个包的标志。
如果在您的情况下这种方法不起作用,那么您可能可以在package.config格式中设置Copy Local标志,然后将该依赖项迁移到您的项目中作为Package Reference格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接