NuGet 包显示没有依赖项?

Mar*_*sen 9 .net nuget visual-studio-2017 packagereference .net-4.7.2

我尝试从 .NET 4.7.2 类库 (VS2017) 制作 NuGet 包,但结果 NuGet 包令人惊讶地显示没有依赖项(这是一个错误)。

我的设置是这样的:

  • 我的类库是 .NET Framework 4.7.2
  • 我的类库使用另一个NuGet 包(具有依赖项)。
  • 我的类库在 .csproj 中使用packageReferences
  • 我的类库包含一个正确的 .nuspec 文件
  • 我使用nuget.exe 包来创建包

nuget.exe包命令应自动填写所需的依赖-这也曾经是较早(在其他项目中)的情况。但是,当时我在我的类库中使用了packages.config而不是packageReferences。这有什么改变吗?

到底是怎么回事?

如何强制系统再次在我的包中包含所需的依赖项?

笔记:

  • 该包由我们 TeamCity 构建服务器(不带 VS2017)上的 MSBuild 脚本构建。构建脚本同时调用“nuget.exe restore”和后来的 “nuget.exe pack”作为其构建逻辑的一部分。

  • MSBuild 是 15.7 版

  • nuget.exe 是版本 4.6.2

Leo*_*SFT 10

如何强制系统再次在我的包中包含所需的依赖项?

这是一个关于nuget pack 使用 PackageReference 而不是 packages.config 时忽略依赖项的已知问题。

要解决此问题,您可以使用以下解决方法,并且 NuGet 团队仍在积极致力于改进此方案:

要打包通过PackageReferencecsproj 本身管理依赖项的 C# 类库 ,

请添加对NuGet.Build.Tasks.Pack( https://www.nuget.org/packages/NuGet.Build.Tasks.Pack/ )的引用 并从命令行运行 msbuild /t:pack

我已经测试了这个解决方法,它工作正常。为确保此解决方法正常工作,我们需要注意以下几点

  • 需要将nuget包添加NuGet.Build.Tasks.Pack到项目中。
  • 需要添加属性 /p:PackageOutputPath="D:\TesterFolder" -p:Authors=tester
  • 使用命令msbuild.exe /t:pack,例如:msbuild.exe /t:pack "MyTestLibrary.csproj" /p:PackageOutputPath="D:\TestFolder" -p:Authors=tester

此外,如果要使用.nuspecfile 来创建 nuget 包,则应使用以下.nuspec文件:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyTestLibrary</id>
    <version>1.0.0</version>
    <authors>Tester</authors>
    <owners>Tester</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package description</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2018</copyright>
    <tags>Tag1 Tag2</tags>
    <dependencies>
      <group targetFramework=".NETFramework4.7.2">
        <dependency id="Microsoft.Owin" version="4.0.0" exclude="Build,Analyzers" />
      </group>
    </dependencies>
  </metadata>

    <files>
        <file src="bin\Debug\MyTestLibrary.dll" target="lib\net472\MyTestLibrary.dll" />
    </files>
</package>
Run Code Online (Sandbox Code Playgroud)

然后我们可以nuget.exe pack用来创建 nuget 包。但是,使用这种方法,我们必须在.nuspec文件中手动填写所需的依赖项。

希望这可以帮助。