避免nuget包中的依赖

时间:2018-08-14 13:51:55

标签: nuget

我有一个类库a.dll,它依赖于“ newtonsoft.json.dll”和b.dll(它是一个单独的nuget包)。

我正在尝试为a.dll创建一个nuget包。为了使该程序包正常工作,需要b.dll。

当我在新项目中引用a.dll的软件包时,它将为b.dll添加一个nuget引用。我不希望那样发生。当我引用a.dll软件包时,不应强制安装nuget软件包b.dll。

有没有办法避免从我的软件包(a.dll)中使用b.dll。请注意,a.dll软件包需要b.dll才能起作用。

1 个答案:

答案 0 :(得分:0)

结合使用“旧”样式的项目文件和 package.nuspec 文件

要打包一个不包含您依赖的其他.dll的软件包,您将需要进行两次修改。

首先,您需要在属性中将对 Newtonsoft.Json 的引用标记为Copy Local False。

Newtonsoft.Json dll set as Copy Local: False

第二,您需要将 Newtonsoft.Json 设置为nuspec文件中的依赖项。

<dependencies>
   <dependency id="Newtonsoft.Json" version="12.0.3" />
</dependencies>

这将允许Visual Studio在用户安装具有 a.dll b的 a.nupkg 时从Nuget中显示和提取依赖项程序包。 dll 内部

使用“新的” aka SDK样式项目文件

这很容易,因为它为您完成了大部分工作,而您所需要的只是在项目中包含PackageReference行,并且dotnet pack命令将知道这是一个外部依赖项

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\b.csproj" />
  </ItemGroup>
</Project>

有关nuspec和项目文件PackageReference的更多信息,请参见https://docs.microsoft.com/en-gb/nuget/concepts/package-versioning#Constraining_Upgrades_To_Allowed_Versions

来自Microsoft的完整nuspec示例: https://github.com/microsoft/CRA/blob/3ffff95fbbd89a682d17c7dc8a6930164598a440/src/CRA.Worker/CRA.nuspec

来自Newtonsoft.Json https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Newtonsoft.Json.csproj

以外的其他人的ProjectReference示例更复杂但仍然很好。