3

我有一些要求将 NuGet dll 的 Copy Local 设置为 false。在此之前,我使用了package.config格式,一切正常。迁移到包参考格式后,我找不到如何做到这一点。有人可以帮助我吗?

4

3 回答 3

6

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

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

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

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

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

于 2019-03-11T15:18:32.823 回答
0

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

如果这在您的情况下不起作用,那么您也许可以像以前一样在 package.config 格式中设置 Copy Local 标志,然后将该依赖项作为 Package Reference 格式迁移到您的项目中。

于 2019-03-11T12:11:19.797 回答
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>

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

于 2019-03-12T22:14:28.933 回答