【问题标题】:Is it possible to automatically update Nuget packages after a WinForms installation?安装 WinForms 后是否可以自动更新 Nuget 包?
【发布时间】:2020-10-25 13:42:39
【问题描述】:

假设我有一个 Windows 窗体应用程序,其中包含一些重要且需要保持最新的 Nuget 包。

是否可以从非开发环境以编程方式更新 Nuget 包?对于非开发环境,我指的是运行 WinForms 应用程序的随机用户(将其安装在他们的电脑上)。

我已经阅读了一些关于使用 nuget.exe 的内容,但是更新 nuget 包应该会导致 .dll 文件被放置在安装文件夹中。

【问题讨论】:

  • 如果是自动更新,想想老版本的dll是否支持某些方法,而新版本已经删除了。
  • 是的,有道理。我想这意味着这是不可能的:/
  • 是的,我想是的

标签: c# nuget nuget-package nuget-update


【解决方案1】:

可以这样做,但你不应该这样做。 NuGet 包是开发依赖项,不能在已编译的应用程序或客户站点中任意更新,因为

  • 您无法确定您的应用程序是否可以使用更新后的程序集,因为它们可能会引入会导致崩溃或运行时出现意外行为的更改。
  • NuGet 包不仅包括程序集,还包括构建脚本和资源,这些脚本和资源可能依赖于 MS Build 或在您的开发环境中运行的其他工具,以进行部署甚至包含在您自己的程序集中,例如嵌入式资源。
  • 包对程序集和其他包有依赖关系。您还需要更新依赖项,而且很有可能会破坏任何东西。
  • 您需要在交付应用程序时包含 NuGet CLI 可执行文件,并且您的客户需要允许拉取和安装包。
  • 安装软件包而不首先测试它们可能会损害您的应用程序的质量,并且还可能引入安全问题。请记住,您可能正在处理来自潜在公共包源的可执行文件。

话虽如此,不要这样做。相反,请遵循负责任的软件开发周期,在此周期中,您更新软件包并在交付之前彻底测试您的应用程序,并为您的客户提供您整个应用程序的频繁更新。

不过,出于教育目的,您可以使用 Nuget CLI 工具在本地安装软件包,在本示例中为 nuget.exe。您需要指定包标识符、输出目录和框架,例如 .NET Franmework 4.7.2 的 net472。这会将内容以及包本身提取到与您的目标目录结构不匹配的包文件夹结构中的输出文件夹中。从那里,您需要将所需的资产复制到安装目录中,例如带有复制脚本。除了不是正确的做法之外,这非常麻烦并且很可能被认为是失败的。

nuget install <PackageId> -OutputDirectory <OutputDirectory> -Framework <Framework>

【讨论】:

  • 感谢您提供的信息 :) 一开始我有点怀疑,但毕竟这似乎太好了。
  • 我意识到这并不一定让它变得聪明,但你的担忧不正是semantic versioning 旨在解决的问题吗?我的意思是,您应该想要为您的依赖项提供最新的安全补丁,并且我希望至少通过VersionInUse.*.* 保持在发布列车上。我并不是说它一定很容易,而是npm has gotten extremely nuanced 的自动更新方法,以及nuget supports much of the same
【解决方案2】:

如果是自动更新,那就想想老版本的dll是否支持某些方法,而在新版本中它已经被删除了。

虽然您可以在构建时更新包。

通过选择“工具”>“选项”>“NuGet 包管理器”启用自动包恢复,然后在“包恢复”下选择“在 Visual Studio 中构建期间自动检查丢失的包”。

参考:https://docs.microsoft.com/en-us/nuget/consume-packages/package-restore#restore-packages-automatically-using-visual-studio

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-13
    • 2018-03-08
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2011-05-04
    相关资源
    最近更新 更多