使用专用 PowerShellGet 存储库

PowerShellGet 模块支持 PowerShell 库以外的存储库。 这些 cmdlet 支持以下场景:

  • 支持在环境中使用一组受信任的、预先验证的 PowerShell 模块
  • 测试构建 PowerShell 模块或脚本的 CI/CD 管道
  • 将 PowerShell 脚本和模块交付给无法访问 Internet 的系统
  • 提供仅供你的组织使用的 PowerShell 脚本和模块

本文介绍如何设置本地 PowerShell 存储库。 本文还介绍了可以从 PowerShell 库获得的 OfflinePowerShellGetDeploy 模块。 该模块包含 cmdlet,用于将 PowerShellGet 的最新版本安装到本地存储库中。

本地存储库类型

有两种方法可以创建本地 PSRepository:NuGet 服务器或文件共享。 每种类型都有优点和缺点:

NuGet 服务器

优点 缺点
模拟 PowerShellGallery 功能 多层应用需要操作规划和支持
NuGet 与 Visual Studio 等其他工具集成 需要身份验证模型和 NuGet 帐户管理
NuGet 支持 .Nupkg 包中的元数据 发布需要进行 API 密钥管理和维护
提供搜索、包管理等。

文件共享

优点 缺点
易于设置、备份和维护 除了基本文件共享之外,没有 UI
简单安全模型 - 用户的共享权限 有限的安全性且没有有关用户更新内容的记录
没有诸如替换现有项之类的约束

PowerShellGet 适用于任一类型,并支持查找版本和依赖项安装。 但是,一些适用于 PowerShell 库的功能不适用于基本 NuGet 服务器或文件共享。 脚本、模块、DSC 资源或角色功能没有差异。

创建 NuGet.Server 存储库

以下文章列出了设置自己的 NuGet 服务器的步骤。

按照以下步骤操作,直到添加包为止。 本文稍后会介绍有关发布包的步骤。

对于基于文件共享的存储库,请确保用户有权访问文件共享。

注册本地存储库

在使用存储库之前,必须使用 Register-PSRepository 命令对其进行注册。 在下面的示例中, InstallationPolicy 设置为 Trusted,前提是你信任自己的存储库。

# Register a NuGet-based server
$registerPSRepositorySplat = @{
    Name = 'LocalPSRepo'
    SourceLocation = 'http://MyLocalNuget/Api/V2/'
    ScriptSourceLocation = 'http://MyLocalNuget/Api/V2'
    InstallationPolicy = 'Trusted'
}
Register-PSRepository @registerPSRepositorySplat

# Register a file share on my local machine
$registerPSRepositorySplat = @{
    Name = 'LocalPSRepo'
    SourceLocation = '\\localhost\PSRepoLocal\'
    ScriptSourceLocation = '\\localhost\PSRepoLocal\'
    InstallationPolicy = 'Trusted'
}
Register-PSRepository @registerPSRepositorySplat

请注意这两个命令处理 ScriptSourceLocation 方式的差异。 对于基于文件共享的存储库,SourceLocation 和 ScriptSourceLocation 必须匹配。 对于基于 Web 的存储库,它们必须不同,因此,在此示例中,在 SourceLocation 中添加了一个尾随的“/”。

使用文件共享协议(如 NFS 或 SMB)时,请务必遵循保护协议的建议指南。 有关在 Windows 上保护 SMB 的详细信息,请参阅 [SMB 安全增强功能][09]。

如果希望将新创建的 PSRepository 作为默认存储库,则必须注销所有其他 PSRepository。 例如:

Unregister-PSRepository -Name PSGallery

注意

保留了存储库名称“PSGallery”以供 PowerShell 库使用。 可以取消注册 PSGallery,但不能将名称 PSGallery 用于任何其他存储库。

如需还原 PSGallery,请运行以下命令:

Register-PSRepository -Default

发布到本地存储库

一旦注册本地 PSRepository,就可以将其发布到本地 PSRepository。 有两个主要发布方案:发布你自己的模块和发布 PSGallery 中的模块。

发布自己编写的模块

使用 Publish-ModulePublish-Script 将模块发布到本地 PSRepository,具体方法与对 PowerShell 库执行的操作相同。

  • 指定代码的位置
  • 提供 API 密钥
  • 指定存储库名称。 例如: -PSRepository LocalPSRepo

注意

必须在 NuGet 服务器中创建一个帐户,然后登录以生成并保存 API 密钥。 对于文件共享,请对 NuGetApiKey 值使用任何非空字符串。

示例:

# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
    Path = 'c:\projects\MyModule'
    Repository = 'LocalPsRepo'
    NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat

重要

为了确保安全性,不应在脚本中对 API 密钥进行硬编码。 使用安全的密钥管理系统。 手动执行命令时,不应以纯文本形式传递 API 密钥以避免记录该密钥, Read-Host 可以使用 cmdlet 安全地传递 API 密钥的值。

# Publish to a file share repo - the NuGet API key must be a non-blank string
$publishModuleSplat = @{
    Path = 'c:\projects\MyModule'
    Repository = 'LocalPsRepo'
    NuGetApiKey = 'AnyStringWillDo'
}
Publish-Module @publishModuleSplat

从 PSGallery 发布模块

若要将模块从 PSGallery 发布到本地 PSRepository,可以使用 Save-Package cmdlet。

  • 指定包的名称
  • 指定“NuGet”作为提供程序
  • 将 PSGallery 位置指定为源 (https://www.powershellgallery.com/api/v2)
  • 指定本地存储库的路径

示例:

# Publish from the PSGallery to your local Repository
$savePackageSplat = @{
    Name = 'PackageName'
    ProviderName = 'NuGet'
    Source = 'https://www.powershellgallery.com/api/v2'
    Path = '\\localhost\PSRepoLocal\'
}
Save-Package @savePackageSplat

如果本地 PSRepository 是基于 Web 的,则需要使用 nuget.exe 进行发布的其他步骤。 请参阅有关使用 nuget.exe 的文档。

在断开连接的系统上安装 PowerShellGet

在要求系统与 Internet 断开连接的环境中,部署 PowerShellGet 非常困难。 PowerShellGet 有一个启动过程,它会在第一次使用时安装最新版本。 PowerShell 库中的 OfflinePowerShellGetDeploy 模块提供了支持此启动过程的 cmdlet。

若要启动离线部署,需要:

  • 在连接 Internet 的系统和断开连接的系统上下载并安装 OfflinePowerShellGetDeploy
  • 使用 Save-PowerShellGetForOffline cmdlet 在连接 Internet 的系统上下载 PowerShellGet 及其依赖项
  • 将 PowerShellGet 及其依赖项从连接 Internet 的系统复制到断开连接的系统
  • 在断开连接的系统上使用 Install-PowerShellGetOffline,将 PowerShellGet 及其依赖项置于适当的文件夹中

以下命令使用 Save-PowerShellGetForOffline 将所有组件都放入文件夹 f:\OfflinePowerShellGet

# Requires -RunAsAdministrator
#Download the OfflinePowerShellGetDeploy to a location that can be accessed
# by both the connected and disconnected systems.
Save-Module -Name OfflinePowerShellGetDeploy -Path 'F:\' -Repository PSGallery
Import-Module F:\OfflinePowerShellGetDeploy

# Put PowerShellGet somewhere locally
Save-PowerShellGetForOffline -LocalFolder 'F:\OfflinePowerShellGet'

此时,必须使 F:\OfflinePowerShellGet 的内容对断开连接的系统可用。 运行 Install-PowerShellGetOffline cmdlet 在断开连接的系统上安装 PowerShellGet。

备注

在运行这些命令之前,请务必不要在 PowerShell 会话中运行 PowerShellGet。 将 PowerShellGet 加载到会话中后,将无法更新组件。 如果意外启动 PowerShellGet,请退出并重启 PowerShell。

Import-Module F:\OfflinePowerShellGetDeploy
Install-PowerShellGetOffline -LocalFolder 'F:\OfflinePowerShellGet'

运行这些命令后,便可以将 PowerShellGet 发布到本地存储库。

# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
    Path = 'F:\OfflinePowershellGet'
    Repository = 'LocalPsRepo'
    NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat

重要

为了确保安全性,不应在脚本中对 API 密钥进行硬编码。 使用安全的密钥管理系统。 手动执行命令时,不应以纯文本形式传递 API 密钥以避免记录该密钥, Read-Host 可以使用 cmdlet 安全地传递 API 密钥的值。

# Publish to a file share repo - the NuGet API key must be a non-blank string
$publishModuleSplat = @{
    Path = 'F:\OfflinePowerShellGet'
    Repository = 'LocalPsRepo'
    NuGetApiKey = 'AnyStringWillDo'
}
Publish-Module @publishModuleSplat

使用打包解决方案托管 PowerShellGet 存储库

你还可以使用打包解决方案(如 Azure Artifacts)来托管专用或公用的 PowerShellGet 存储库。 有关详细信息和说明,请参阅 Azure Artifacts 文档