【问题标题】:Is there a way to "install" nuget package like the way Visual Studio does, but on a deployment server有没有办法像 Visual Studio 那样“安装”nuget 包,但是在部署服务器上
【发布时间】:2020-05-28 20:25:25
【问题描述】:

背景:

我对打包和发布 nuget 相当陌生。长话短说,我有一个 C# 项目(我们称之为 MYAPI 项目),它依赖于一堆其他的 nuget 包。 MYAPI 的一些消费者希望将其作为 nuget 包引用并自行处理其产品的部署,而另一些消费者则希望将 MYAPI dll 安装在特定文件夹中,他们将在运行时从中获取它。

所以我已将 MYAPI 打包为 nuget 并将其发布到内部 nuget 服务器上。

问题:

如何将我的 nuget 包安装到服务器上,使其具有所有必需的依赖项。我希望它看起来像bin\debug 文件夹的样子,即基于目标框架,从所有依赖 nuget 包中复制相关文件,包括主 nuget 包(在本例中为 MYAPI)

我知道除了 nuget 包之外,我可以通过将 MYAPI 打包为 zip 文件或 msi 来实现这一点。但我不想要 MYAPI 的多种类型的包,并且宁愿只使用 nuget 包。我也明白我可以在 nuspec 的 <files> 部分引用所有依赖项,但我认为这是一个穷人的做法。

有没有办法像 Visual Studio 那样做,即下载主 nuget 包及其所有依赖项,提取它们,然后将所有提取的 nuget 包中的相关(基于框架版本)文件复制到 bin\debug文件夹。如果开箱即用不可用,有人可以指出我使用 VS 将文件复制到 bin\debug 文件夹的“智能”,以便我可以在安装脚本中复制它。

编辑:

这是一个常规的 .NET Framework 项目,我说的是在生产服务器上安装,其中 MSBuild、VS 等开发工具不可用。我仍然可以使用 nuget.exe 命令,因为它是一个可执行文件。

【问题讨论】:

  • 执行 nuget 还原。无需安装。它是一个什么样的 c# 项目? .net 核心还是框架?
  • 您应该构建一个已发布的输出副本。
  • 这是正确的做法。有很多托管的 ci 服务
  • Nuget 应该为你处理依赖项
  • @DanielA.White 情况是来自 repo 的 nupkg 文件具有它需要的所有信息,但是没有可以在 prod 服务器上运行的命令来获取所有文件,包括依赖项,这是我的 dll 要求的,以便在运行时使用 Assembly.LoadFrom 来加载我的 dll 的另一个产品有用。我已经为在构建时与我链接的消费者提供了它,因为他们的 VS 有这样做的智能

标签: c# .net visual-studio nuget continuous-deployment


【解决方案1】:

有没有办法像 Visual Studio 那样“安装”nuget 包 可以,但在部署服务器上

我认为你对这个问题有一些误解,我担心你想要的东西不能被 nuget 实现。

其实是将相关的nuget包的内容复制到bin\Debug中是MSBuild的工作。

其实MSBuild(MSBuild.exe)是一个带有vs开发环境的可执行文件。

Nuget 只负责将包下载到您的本地,然后将其与您的项目相关联。实际的内容复制操作纯粹是 MSBuild 的工作。

VS IDE 中,MSBuild 负责此操作。当你点击构建时(实际上它调用MSBuild.exe),nuget包的依赖DLL将被复制到你的输出文件夹中。

为了证明,你可以新建一个空项目,然后安装这个nuget包,然后检查文件是否在bin\Debug下。之后,请执行Build检查文件是否存在。

解决方案

VS2017开始,MSBuild可以单独安装,无需VS IDE

你可以安装Build Tool for Visual Studio 2019

所有下载--> Tools for Visual Studio 2019--> Build Tool for Visual Studio 2019

由于它可以与 VS 分开安装并且是轻量级的,现在许多开发人员使用它在生产服务器上构建项目。

当你使用nuget.exe在你的项目中安装这样的nuget包,然后使用构建工具执行这样的命令msbuild xxx\xxx\xxx.csproj -t:build来构建项目。之后,您将在bin\Debug 文件夹中看到它们。

更新 1

实际上,nuget 负责决定要复制哪些相应的依赖项。但是 nuget 会将这些信息传递给 MSBuild。 Nuget只是确定相应的信息,就像制定一个计划,具体的动作由MSBuild执行,包括引用、恢复、复制等。所以你应该运行 MSBuild 来得到你想要的。

另外,如果你仍然得到你想要的并跳过MSBuild直接获取文件,你可以suggest a feature to the Team。(点击Suggest a Feature )。

【讨论】:

  • 我知道 MSBuild 实际上会根据复制本地标志从正确的 packages\lib\**\net* 文件夹中复制 dll,但 nuget 决定要下载哪些依赖项、要使用哪些 lib\net* 文件夹以及此类逻辑提供情报。如果智能部分可以通过一些 nuget 命令或类似工具完成,则可以使用复制命令轻松复制实际的复制部分
  • 我认为你有一些误解。实际上,nuget 的工作决定了要复制哪些相应的依赖项。但是 nuget 会将这些信息传递给 MSBuild。 Nuget只是确定了相应的信息,就像制定计划一样,具体的动作由MSBuild执行,包括referencerestorecopy等。所以你应该运行 MSBuild 来得到你想要的。
【解决方案2】:

您可以使用临时/发布项目。使用您想要的任何 TFM 创建项目,将 PackageReference 添加到包中,运行 dotnet publish,然后从发布目录中删除 <project_name>.*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多