NuGet程序包引用在本地复制dll

时间:2019-03-11 11:41:27

标签: c# visual-studio nuget nuget-package packagereference

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

3 个答案:

答案 0 :(得分:0)

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

如果在您的情况下不起作用,则可以像以前一样以package.config格式设置“复制本地”标志,然后将该依赖项作为“包引用”格式迁移到项目中。

答案 1 :(得分:0)

您可以使用PrivateAssets。 Copied from the docs

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

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

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

编辑:实际上,您可能需要使用<ExcludeAssets>runtime</ExcludeAssets>

答案 2 :(得分:0)

我写了这个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>

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