选择适当的 Nuget 包管理器并在 IIS 中设置

你已经构建了一个应用程序,或者甚至是一组重要的脚本,并且需要将其打包并部署。毋需再寻找,NuGet及其各种可用的NuGet软件包管理器将是你的不二选择。

在这篇文章中,你将学到如何首次设置各种NuGet软件包管理器,以便立即开始使用它们。

相关: 在Windows上设置NuGet服务器(完整演示)

设置NuGet.Server包装器

虽然从头开始设置NuGet.Server并不太复杂,但对于刚接触Visual Studio和IIS的新手来说可能会花费一些时间。加速设置和更新过程的方法之一是使用一个包装器。其中最受欢迎的包装器之一是名为nuget-server的,由svenkle编写,可以在他们的Github页面找到。

使用此包装器而不是手动安装Web服务器的一个主要区别之一是它使用IIS Express。你可以在Microsoft的网站上阅读更多关于这些差异的信息。

设置纯粹的NuGet.Server和使用此包装器之间的两个重要区别是:

  • 你必须创建一个Windows服务来启动Web服务器
  • 你不能使用IIS管理器进行配置

使用包装器安装 NuGet.Server 的主要缺点是,在包装器更新之前,你无法轻松更新版本。

先决条件

如果你想学习如何设置 NuGet.Server 包装器,首先确保你已经具备以下条件:

安装 Web 服务器服务

第一步是创建一个新的 Windows 服务。由于这个 NuGet.Server 包装器不使用 IIS,你无法依赖于 IIS。

使用从发布页面下载的NuGetServer.zip 文件,将文件解压缩到 Web 服务器上的选择目录。解压缩后,创建一个 Windows 服务,以在启动服务器时自动启动网页。下面是一个用于执行此操作的 PowerShell 命令。

New-Service -Name NuGetServer -BinaryPathName '<UnzipPath>\Svenkle.NuGetServer.Service.exe' -StartupType Automatic
Start-Service -Name NuGetServer

自定义 Web 服务器

现在您已经从包装器中安装了 NuGet.Server,并且服务已创建并启动,现在是时候自定义 web.config 文件 了。您可以按照手动部署时对 web.config 文件所做的更改来进行相同的更改,如果您愿意的话。

位于 <UnzipPath>\Host\Website 文件夹中的 web.config 文件。这种部署的主要区别在于它使用端口 8080 而不是默认的 HTTP 端口 80。这意味着您无论何时使用 Web URL,都必须附加 :8080,例如,当访问网页时,它将是 http://localhost:8080/nuget

搞定了。这比使用 Visual Studio 轻松多了!

在 IIS 上设置 BaGet

到目前为止,您只关注了 NuGet.Server 的标准版本,但实际上还有很多其他可用的版本。一个流行的 NuGet 包管理器是一个名为 BaGet 的开源项目。

让我们看看在 Windows Server 上通过 IIS 安装和运行 BaGet 需要做些什么。

先决条件

开始之前,请确保您满足一些先决条件。

  • BaGet.zip – 在撰写本文时,该项目仍处于预发布阶段,我正在使用 v0.1.77
  • .NET Core Runtime & Hosting Bundle – 这将需要下载并在 Web 服务器上供稍后使用。
  • Windows Server – 任何当前支持的Windows Server版本都可以使用,但所有的截图都是在Windows Server 2019 Standard上进行的

安装Web服务器先决条件

虽然以下步骤可以在安装了.NET Core的Linux系统上或者在Docker镜像中运行,但这些指令将用于在Windows服务器上安装BaGet。这样,您就可以利用IIS启动和停止服务器。

安装IIS

由于BaGet在.NET Core上运行,所需的要求没有基本的NuGet.Server那么多,您只需要一个默认的IIS Web服务器和IIS管理器。要安装这些组件,请在Web服务器上打开PowerShell会话并运行:

Install-WindowsFeature Web-Server -IncludeManagementTools

安装.NET Core

接下来,在Web服务器上安装.NET Core捆绑包。要执行此操作,请运行之前下载的exe文件。您可以将此安装的所有选项保持为默认设置。

必须在安装IIS后安装.NET Core捆绑包。如果这个顺序不正确,您将不得不重新运行.NET Core捆绑包的安装程序,并选择修复以添加Web应用程序所需的缺失要求。

现在,您已经准备好了Web服务器组件,请解压之前下载的 BaGet.zip 文件并将其放置在您的Web服务器的 C:\inetpub\wwwroot 文件夹中。

配置Web服务器应用程序

类似于NuGet.Server,您需要设置一些IIS组件才能使NuGet包管理器BaGet正常运行。

创建BaGet IIS应用程序池

在Web服务器上打开IIS管理器,转到应用程序池。为BaGet创建一个新的应用程序池,因为它不会使用.NET托管代码。您可以根据需要命名它。以下是应该如何设置的。

Creating a BaGet application pool

创建BaGet网站

创建应用程序池后,创建网站。由于BeGet使用非标准HTTP端口和非默认应用程序池,因此最简单的方法是从默认网站创建一个单独的网站。要执行此操作,请在IIS管理器中右键单击网站文件夹,然后选择添加网站

以下是您需要配置BaGet的设置。

Creating a BaGet IIS Website

配置网站后,它应该会自动启动。您可以通过从服务器访问http://localhost:5000/ 来查看它。

BaGet packages web page

您会注意到与标准NuGet.Server网页相比,BaGet网页上有更多的用户界面。在BaGet中,您可以轻松搜索已上传的软件包,并且它还提供了如何以各种方式上传的命令,而不是使用NuGet命令行选项。

自定义BaGet Web服务器

请记住,您可以使用web.config文件自定义您的NuGet.Server服务器。但是,NuGet软件包管理器BaGet不使用web.config文件。相反,由于BaGet也可以在Linux上使用,开发人员选择了一种更跨平台的格式,使用名为appsettings.json的JSON文件。它位于C:\inetpub\wwwroot\BaGet文件夹中。

请注意,由于BaGet使用.NET Core实现跨平台功能,所有路径都使用正斜杠。

例如,如果您想要将您的软件包路径设置为服务器上的C:\Packages,您需要在appsettings.json文件中进行如下设置。

"Storage": {
    "Type": "FileSystem",
    "Path": "C://Packages"
}

BaGet API密钥

为了保护您的NuGet服务器免受未经授权的用户发布或删除软件包的影响,您仍然需要设置API密钥。API密钥设置也位于appsettings.json中,因此您可以在那里设置它。

由于我正在使用PowerShell来管理我的NuGet软件包,我可以再次注册一个PSRepository。对于BaGet,请导航到您创建的网页。该网页将向您提供在PowerShell会话中运行的命令。例如:

Register-PSRepository -Name "BaGet" -SourceLocation "http://<WebServer>:5000/v3/index.json" -PublishLocation "http://<WebServer>:5000/api/v2/package" -InstallationPolicy "Trusted"

理解BaGet分支(LiGet)

虽然BaGet提供了许多使用选项,但还有其他的BaGet分支专门用于NuGet的其他领域。其中最受欢迎的分支之一是LiGet。LiGet与众不同之处在于,它专注于以Linux为先的视角。

LiGet 是 BaGet 的一个 NuGet 包管理器分支。开发者决定这样做有几个原因,但主要是为了专注于 NuGet 的一些特定功能,包括 v3 feed 支持。V3 feed 支持不影响 PowerShell 的使用情况。但如果你要为其他用例托管 NuGet 服务器,你可能会喜欢增加的功能。

LiGet 的哈希 API 密钥

LiGet 与 BaGet 的一个主要区别是使用哈希 API 密钥而不是明文。使用明文密钥,拥有对 NuGet.Server 的 web.config 文件或对 BaGet 的 appsettings.json 文件的访问权限的人可以发布到服务器。但在 LiGet 中不会发生这种情况。

要使 LiGet 运行起来,您需要创建一个哈希 API 密钥,并将其放入 appsettings.json 文件中的 C:\inetpub\wwwroot\LiGet 文件夹中

要创建哈希,您可以使用 PowerShell 或您熟悉的任何其他哈希方法。下面是在您的工作站上运行以创建哈希的示例。

([System.Security.Cryptography.HashAlgorithm]::Create('SHA256').ComputeHash([System.Text.Encoding]::UTF8.GetBytes(<apikey>)) | 
Foreach-Object { $_.ToString('x2')}) -join ''

您还可以使用在线哈希生成器来创建哈希。

这种方法的缺点是如果您忘记了 API 密钥,则必须创建一个新的哈希并替换,因为哈希是不可逆的。

在 IIS 上设置 ProGet

到目前为止,所有已经涵盖的选项都是免费的,并且一旦设置好,就没有太多的移动部件。虽然这对尝试 NuGet 是个好方法,但如果您想要与其他工具集成,或者如果您需要为工作场所中的系统获取供应商支持,那么更好的选择可能是 NuGet 包管理器 ProGet。

先决条件

要设置 ProGet,您将需要一些常见的先决条件,您现在可能已经习惯了,但额外的是一个可选的 SQL 数据库。

  • Windows 服务器 – 任何当前支持的 Windows 服务器版本都可以工作,但所有的截图都是在 Windows Server 2019 Standard 上拍摄的。
  • ProGet 安装程序 – 我正在使用的 ProGet 版本是 5.2.9。
  • SQL 实例 – 这是可选的,因为 ProGet 有一个选项可以从安装程序安装 SQL Express,尽管这需要您的服务器与互联网连接以进行初始下载。

安装 ProGet

从您的 Web 服务器运行 ProGet 安装程序。由于您正在设置 IIS,请在安装 ProGet 时选择IIS Web 服务器选项。如果您尚未安装 IIS,则会在安装 ProGet 期间处理安装。

剩下的选项您可以保留为默认,除非您想在单独的SQL服务器上托管ProGet数据库。在那种情况下,您将需要指定要使用的SQL实例。

如果您将SQL Server选项保持为Install Inedo instance,它将为您安装SQL Express服务器。

Installing ProGet

安装完成后,在提示时启动网站,您应该看到一个看起来像下面截图的网页。

ProGet Home

配置ProGet上的PSRepository

此时,ProGet已安装。这相当简单。由于我们使用PowerShell来处理NuGet包,我们需要设置一个PSRepository,就像我们以前做过的那样。

要为PSRepository设置ProGet,请导航到Feeds选项卡并创建一个新的feed。您可以随意命名feed。然后选择Third-party package formatPowerShell如下所示。

Creating a ProGet PSRepository feed

创建了feed之后,返回Feeds选项卡,选择您的新feed,它将显示用于发布的URL。这是您需要在PowerShell上运行的内容,以发布到或从此PSRepository下载。

以下是从上面示例中显示的内容:

Register-PSRepository -Name ProGet -SourceLocation http://<WebServer>:8624/nuget/PSRepository/ -PublishLocation http://<WebServer>:8624/nuget/PSRepository/ -InstallationPolicy Trusted

添加API密钥

与其他选项一样,您需要生成一个API密钥。要执行此操作,请单击右上角的齿轮图标,然后从左侧工具栏中选择API Keys。在这里,您可以看到现有的API密钥,也可以创建新的。您将立即看到开源和企业ProGet之间的主要区别。使用ProGet,您可以拥有许多API密钥。

ProGet API Keys

API密钥屏幕上,点击创建API密钥。从这里勾选Feed API的复选框,然后点击保存API密钥

Creating a ProGet API Key

一旦API密钥创建完成,系统会带您返回到API密钥页面。在这里,您可以使用所见的API密钥发布软件包。

使用ProGet搜索软件包

ProGet还包括一个网页,允许您搜索Feed中的所有NuGet软件包,查看它们的下载次数,PowerShell模块的名称,软件包上传到哪个Feed以及其他与软件包相关的统计信息,如下所示的软件包页面。

Viewing NuGet packages in ProGet

或者,您可以转到Feeds页面,选择一个Feed以仅查看该Feed的软件包。在那里,您可以深入了解个别软件包的统计信息和其他详细信息,如下所示。

Viewing individual ProGet packages

更新ProGet

使用面向企业的产品的一个好处是一些耗时的管理任务变得更加迅速。例如,更新ProGet就是其中之一。

要将ProGet更新到最新版本,只需在您的Web服务器上打开Inedo Installer。这是您第一次安装ProGet时安装的。点击升级按钮,如下所示,安装程序将为您完成其余操作。

Updating ProGet

NuGet软件包管理器比较

在本文中,您已经了解了有关各种NuGet工具的许多信息。如果您仍在寻找要尝试的工具,本节将让您对每个工具的不同之处有所了解。

BaGet vs. LiGet

由于LiGet是BaGet的一个分支,它们之间有许多相似之处,包括大部分设置过程。实际上,您可以按照与BaGet完全相同的设置流程进行操作。

安装完成后,LiGet和BaGet确实共享一些功能,但在其他方面有所不同。

Feature BaGet LiGet
Web Port 5000 9011
Source URL /v3/index.json /api/v3/index.json
NuGet Search API v2 v3
API Key Plain Text SHA256 hash
Web Interface Can see list of packages and commands to upload No web interface

尽管这些差异大多数不影响与PowerShell的使用,但由于使用了散列的API密钥,设置稍有变化。

BaGet和LiGet都基于.NET Core构建,使它们跨平台,在Linux操作系统和Windows上均可使用。它们都有Docker镜像可用,如果您已经使用容器服务,这可以使设置变得更快速和可移植。

在LiGet和BaGet之间的少数差异中,任何一个都是在Windows上使用NuGet服务器的绝佳选择,同时允许您在将来轻松过渡到Linux或Docker映像而无需太多额外工作。

BaGet vs ProGet

如果您不想在某种程度上自己动手,而是选择简便之路,那么始终可以选择ProGet。不过有一些缺点。ProGet不是开源的,而且绝不是免费的。但是,它更容易设置和使用。

ProGet和BaGet之间有一些重要的区别。

Feature ProGet BaGet
Cost ProGet Free: Free, ProGet Basic: $1995/yr, ProGet Enterprise: $9995+/year Free
Platform Windows Windows, Linux, Docker
Database SQL Internal
Support ProGet Free: Email and Slack support, ProGet Basic and Enterprise: Defined SLAs with Email, Slack and Phone support Community based through GitHub issues

Inedo还对ProGet各个版本之间的功能差异进行了详细解释。

总结

在这篇文章中,你了解了许多关于各种 NuGet 工具和技术的信息。如果你对选择使用哪个 NuGet 服务器感到犹豫不决,现在你应该有更多知识来帮助你做出决定。

你学到了如何配置每个 NuGet 工具以在 Windows 上运行,我们涵盖了每个工具的许多特性。

Source:
https://adamtheautomator.com/nuget-package-manager/