代码之家  ›  专栏  ›  技术社区  ›  J.E.Y

VisualStudio/nuget如何决定要下载/精确下载的包版本?

  •  0
  • J.E.Y  · 技术社区  · 7 年前

    <package id="log4net" version="1.2.11" targetFramework="net461"/>
    

    nuget下载net10到net40的所有版本。此外,.csproj文件中指定的位置与物理位置中指定的位置不一致。

    在上面的示例中,.csproj中的位置类似于:

    src/packages/lognet.1.2.11/lib/log4net.dll
    

    src/packages/log4net1.2.11/lib/netXX-full/log4net.dll
    

    XX可以是10到40,正如我前面所说的,log4net的多个版本被下载和提取。

    由于不一致,项目注定会失败,引用包找不到错误。

    仅供参考:几天前我问了一个相关但不同的问题。

    C# project, compiler complaining missing reference to log4net

    0 回复  |  直到 7 年前
        1
  •  2
  •   zivkan    7 年前

    “直截了当”回答:你不必担心。在项目中安装或升级包时,NuGet会告诉项目系统要在 csproj . 请注意,这与恢复包不是一回事。在中安装包packages.config文件项目意味着VisualStudio将同时修改packages.config文件文件和csproj文件。当您的机器上没有nuget包时,当nuget下载并提取它时,它被称为恢复,而不是安装。在上一个问题中,你说你克隆了别人的回购协议,并试图让它建立起来。你可以问他们为什么csproj与log4net包不匹配nuget.org网站. 或者在visualstudio中,按ctrl-q转到搜索,键入“packagemanagersconsole”并选择它。初始化后,在“default project”下拉列表中选择log4net引用错误的项目,然后键入 Update-Package -reinstall migrating from packages.config to PackageReference ,它没有提示路径问题packages.config文件有。

    详细的回答:当使用NuGet时,“version”一词通常指的是包的版本,在本例中是1.2.11。看着 package page on nuget.org ,在版本历史下,我们可以看到其他版本,如1.2.10、2.0.0、2.0.1到2.0.8。除非有多个项目引用了不同版本的包,否则NuGet不会下载多个版本。

    .NET有不同版本的运行库,其中一些版本与其他版本不兼容,但这些版本称为目标框架名字对象(TFM),尽管不为Microsoft工作的人倾向于将其称为目标框架或类似的名称。它类似于Java、Python、PHP等其他托管运行时或脚本语言,但可能更复杂,因为过去创建了大量tfm,主要针对具有不同功能的不同移动设备。另外,Windows运行时被分成3个“家族”,其中tfm向后兼容,但只在同一个“家族”中。这个 Nuget Client has a complex mapping of compatible TFMs

    一个包可能包含不同TFM的多个dll的另一个原因是,它们希望在较新的TFM中使用较新的api,同时仍然允许针对较旧TFM的项目在不使用新api的情况下使用包。例如,虽然net45、net46、net47和soon net48都与net40兼容,但net40没有async await。因此,一个包可能有一个net40dll,所以以net40为目标的项目仍然可以使用这个包,但是这个包也可以包含一个带有额外异步api的net45 dll。net1x、net2x和net3x都非常旧(net40和net45也是如此),所以软件包很少再为这些旧版本提供dll了。然而,log4net1.2.11发布于2011年,当时这些较旧的tfm可能仍然很常见,值得为其提供兼容性。

    您正在使用的项目具有不存在的HintPath的原因有多种可能。根据您目前提供的信息,听起来可能是有人手动编辑了csproj,或者是有人创建了自己的log4netv1.2.11nuget包,该包的dll位于与上的包不同的位置nuget.org网站. NuGet包被设计成不可变的,这意味着从任何其他NuGet提要下载具有特定包id(name)和包版本的nupkg应该与具有相同包id+版本的所有其他nupkg相同。否则,当NuGet从与安装包的人不同的源恢复包时,可能会出现生成错误。

    最后,努吉packages.config文件不是为手动编辑而设计的。不应编辑和保存packages.config文件在csproj中自己归档或引用或HintPath。使用NuGet Package Manager UI或Package Manager控制台安装、卸载和升级包。在NuGet客户机中有很多逻辑,不仅仅是资产选择,如果包使用特定的特性,那么您将出错。

    在visualstudio2017中,NuGet添加了一种引用包的新方法,称为PackageReference。您可能需要转到“工具”->“选项”,找到NuGet包管理器->常规,然后更改默认包管理格式或启用“首次安装包时允许格式选择”。它还可以右键单击许多项目类型,并有一个迁移到PackageReference的选项,但这并不是针对所有项目类型(主要是ASP.NET). PackageReference不支持某些功能packages.config文件支持,某些项目类型也不支持PackageReference。但在最常见的情况下,它是受支持的,如果您可以使用它,它有几个优点,包括不再在csproj中放置提示路径,并避免您当前遇到的特定问题(在restore NuGet时写入一个文件) obj\project.assets.json 其中包含编译器使用的选定资产的路径,这意味着如果更改源代码存储库结构,只需执行NuGet恢复即可修复它,而使用packages.config文件您可能需要重新安装每个项目中的每个包)。使用.NETCore引入的新SDK样式的项目不支持packages.config文件不管有什么价值。

    哇,我漫无目的地闲逛了很久。我希望这不仅仅是让你困惑。