关于 PowerShell 库 的常见问题解答

什么是PowerShell模块?

PowerShell模块是一个可复用的包,包含部分PowerShell功能。 PowerShell 里的所有东西(函数、变量、DSC 资源等)都可以打包在模块里。 通常,模块是包含特定路径上特定类型文件的文件夹。 市面上有几种不同类型的PowerShell模块。

什么是PowerShell脚本?

PowerShell 脚本是一系列存储在 .ps1 文件中的命令,用于实现重用和共享。 PowerShell 的工作流程也是 PowerShell 脚本,它列出一组任务并为这些任务提供顺序。 欲了解更多信息,请访问“ 使用PowerShell工作流程入门”。

PowerShell 脚本和 PowerShell 模块有何不同?

模块通常更适合分享,但我们支持脚本共享,是为了让你更容易向社区贡献工作流程和脚本。 更多信息,请参阅以下博客:

我如何发布到 PowerShell 库?

您必须在 PowerShell 库 注册账户,才能将包发布到该库。 这是因为发布包需要一个 NuGetApiKey,而该 NuGetApiKey 在注册时提供。 注册时,请使用个人、工作或学校账户登录PowerShell 库。 首次登录时需完成一次性注册流程。 之后,你的NuGetApiKey会在你的个人资料页上显示。

注册完毕后,请使用 Publish-ModulePublish-Script cmdlet将你的软件包发布到图库。 如需了解更多如何运行这些指令的细节,请访问发布标签,或阅读 发布模块发布脚本 文档。

安装或保存包无需注册或登录画廊。

我收到了“未能处理请求”的邮件。 当我尝试将一个包发布到 PowerShell 库 时。 那是什么意思?

完整的错误信息是:“未能处理请求。”“指定的 API 密钥无效或无权访问指定的包。” 远程服务器返回错误:(403)禁止。”

出现该错误的原因可能如下:

  • 指定的API密钥无效。 确保你已经指定了账户中的有效API密钥。 要获取你的API密钥,请查看你的个人资料页面。
  • 指定的包名不属于你。 如果你确认了你的 API 密钥是正确的,那么可能已经存在与你试图使用的包同名的包。 包裹可能已被所有者取消发布,这种情况下它将不会出现在任何搜索结果中。 要确定同名包是否已经存在,打开浏览器并导航到包的详细信息页面: https://www.powershellgallery.com/packages/<packageName>。 例如,直接导航到 会 https://www.powershellgallery.com/packages/pester 带你进入 Pester 模块的详细信息页面,无论它是否未公开。 如果已有名称冲突且未列出的包,你可以:
    • 为您的包裹选择另一个名称。
    • 请联系现有套餐的所有者。

为什么我不能用个人账户登录,但昨天却能登录?

请注意,您的画廊账户无法更改您的主要邮箱别名。 更多信息请参见 Microsoft 电子邮件别名

为什么我在包裹标签页中选择所有类别复选框时,看不到所有画廊包裹?

通过选择“类别”复选框,你表示“我想查看该类别中的所有包裹”。只显示所选类别的包裹。 同样地,通过选择所有类别复选框,你是在说“我想看到任何类别中的所有包裹”。但画廊中的部分包裹不属于列出的任何类别,因此不会出现在结果中。 要查看画廊中的所有包裹,取消勾选所有类别,或再次选择包裹标签。

将模块发布到 PowerShell 库 有哪些要求?

任何类型的PowerShell模块(脚本模块、二进制模块或manifest模块)都可以发布到画廊。 要发布一个模块,PowerShellGet 需要了解一些相关信息——版本、描述、作者以及它的授权方式。 这些信息在发布过程中可以从 模块清单 (.psd1)文件读取,或从 Publish-Module 命令的 LicenseUri 参数值读取。 所有发布到画廊的模块必须包含模块清单。 任何在清单中包含以下信息的模块都可以发布到画廊:

  • 版本
  • 说明
  • 作者
  • 模块许可条款中的URI,可以作为清单的PrivateData部分的一部分,或Publish-Module命令的LicenseUri参数中。

我该如何创建一个格式正确的模块清单?

创建模块清单最简单的方法是运行 New-ModuleManifest cmdlet。 在PowerShell 5.0及更新版本中,New-ModuleManifest 生成一个格式正确的模块清单,包含空白字段,用于存储有用的元数据,如 ProjectUriLicenseUriTags。 只需填写空白,或使用生成的清单作为格式正确示例即可。

为了验证所有必需的元数据字段是否已正确填写,请使用 Test-ModuleManifest cmdlet。

要更新模块 manifest 文件字段,请使用 Update-ModuleManifest cmdlet。

将剧本发布给画廊有哪些要求?

任何类型的PowerShell脚本(脚本或工作流)都可以发布到画廊。 要发布脚本,PowerShellGet 需要了解一些相关信息——版本、描述、作者以及它的授权方式。 这些信息作为发布过程的一部分,可以从脚本文件的 PSScriptInfo 部分读取,或从 Publish-Script 命令的 LicenseUri 参数值读取。 所有发布到画廊的脚本必须包含元数据信息。 任何包含以下信息的PSScriptInfo板块脚本都可以发布到画廊:

  • 版本
  • 说明
  • 作者
  • 脚本许可条款的URI,可以作为脚本的PSScriptInfo部分的一部分,或Publish-Script cmdlet的LicenseUri参数中。

我该如何搜索?

在文本框中输入你要找的内容。 例如,如果你想查找与 Azure SQL 相关的模块,只需输入“azure sql”。 我们的搜索引擎会在所有已发布的软件包中寻找这些关键词,包括标题、描述以及跨元数据。 然后,基于加权质量评分,它会显示最接近的匹配。 你也可以在搜索查询中使用field:“value”语法按特定字段搜索以下字段:

  • 标记
  • Functions
  • Cmdlets(命令行小程序)
  • DSC资源
  • PowerShellVersion

例如,当你搜索PowerShellVersion:“2.0”时,只显示与PowerShellVersion 2.0兼容(基于模块/脚本清单)的结果。

我该如何创建一个格式正确的脚本文件?

创建格式正确脚本文件最简单的方法是运行 New-ScriptFileInfo cmdlet。 在PowerShell 5.0中,New-ScriptFileInfo 生成一个格式正确的脚本文件,并为有用的元数据(如 ProjectUriLicenseUriTags)设置空字段。 只需填补空白,或者使用生成的脚本文件作为格式正确的示例。

要验证所有必需的元数据字段是否已正确填写,请使用 Test-ScriptFileInfo cmdlet。

要更新脚本元数据字段,请使用 Update-ScriptFileInfo cmdlet。

还有哪些其他类型的PowerShell模块存在?

PowerShell模块一词也指实现实际功能的文件。 脚本模块文件(.psm1)包含PowerShell代码。 二进制模块文件(.dll)包含编译后的代码。

这里有一种理解方式:封装模块的文件夹就是模块文件夹。 模块文件夹可以包含一个模块清单(.psd1),描述文件夹内容。 真正完成工作的文件是脚本模块文件(.psm1)和二进制模块文件(.dll)。 DSC 资源位于特定的子文件夹中,并以脚本模块文件或二进制模块文件的形式实现。

Gallery 中的所有模块都包含模块清单,大多数模块包含脚本模块文件或二进制模块文件。 由于这些不同的含义,“模块”一词可能令人混淆。 除非另有明确说明,本页所有“module”一词的使用均指包含这些文件的 module 文件夹。

PackageManagement 与 PowerShellGet 有什么关系? (高层次回答)

PackageManagement 是与任何包管理器协作的常见接口。 最终,无论你是处理PowerShell模块、MSI、Ruby gem、NuGet包还是Perl模块,你都能用PackageManagement的命令(Find-Package 和 Install-Package)找到并安装它们。 PackageManagement通过为每个包管理器配备一个包提供者来实现这一点,这些管理器连接到PackageManagement。 提供者承担所有实际工作;他们从仓库获取内容,并在本地安装内容。 通常,包提供商只是包裹现有的包管理器工具,针对特定包类型进行了包包管理。

PowerShellGet 是 PowerShell 包的管理器。 有一个PSModule包提供商通过PackageManagement暴露PowerShellGet功能。 因此,你可以运行 Install-Module,或者Install-Package -Provider PSModule从 PowerShell 库 安装模块。 某些PowerShellGet功能,包括 Update-ModulePublish-Module,无法通过PackageManagement命令访问。

总之,PowerShellGet 专注于为 PowerShell 内容提供高级包管理体验。 PackageManagement 专注于通过一套通用工具展示所有包管理体验。 如果你觉得这个答案不满意,可以在文档底部的“ PackageManagement 究竟如何与 PowerShellGet 相关?” 部分有一篇详细的回答。

欲了解更多信息,请访问 包管理项目页面

NuGet 和 PowerShellGet 有什么关系?

PowerShell 库 是 NuGet Gallery 的修改版本。 PowerShellGet 使用 NuGet provider来配合基于 NuGet 的仓库,比如 PowerShell 库。

你可以在任何有效的NuGet仓库或文件共享中使用PowerShellGet。 你只需通过运行 Register-PSRepostory cmdlet 添加仓库即可。

这是不是意味着我可以用 NuGet.exe 来和画廊合作?

Yes.

PackageManagement 实际上和 PowerShellGet 有什么关系? (技术细节)

PowerShellGet 在底层高度利用了包管理基础设施。

在PowerShell cmdlet层, 安装模块 实际上是一个薄 Install-Package -Provider PSModule包裹的。

在PackageManagement包提供者层,PSModule包提供者实际上调用其他PackageManagement包提供者。 例如,当你使用基于 NuGet 的画廊(如 PowerShell 库)时,PSModule 包提供者使用 NuGet 包提供商来处理仓库。

PowerShellGet 架构示意图

图1:PowerShellGet 架构

运行PowerShellGet需要具备什么?

一般来说,我们建议选择最新版本的PowerShellGet模块(注意它需要.NET 4.5)。

PowerShellGet 模块需要 PowerShell 3.0 或更新版本

因此, PowerShellGet 需要以下操作系统之一:

  • Windows 10操作系统
  • Windows 8.1 专业版
  • Windows 8.1 企业版
  • Windows 7 SP1
  • Windows Server 2016
  • Windows Server 2012 R2
  • Windows Server 2008 R2 SP1

PowerShellGet 还需要 .NET Framework 4.5 及以上版本。 有关详细信息,请参阅 安装面向开发人员的 .NET Framework

是否有可能为未来发布的包保留名称?

无法用字来抄截包名。 如果你觉得现有包裹采用了更适合你包裹的名字,试着 联系包裹的所有者。 如果几周内没有回复,可以联系客服,PowerShell 库团队会帮你处理。

我该如何申报包裹的所有权?

我该如何应对一个违反我包装许可的包裹所有者?

我们鼓励PowerShell社区共同努力,解决包所有者与其他包所有者之间可能出现的任何争议。 我们制定了争议 解决程序 ,请您在 PowerShellGallery.com 管理员介入前遵循。